11.大多数水的容器
类型:中等
喜欢: 26.5k
不喜欢: 1.4K
问这个问题的公司
公司:没有时间问
Microsoft 4
Google 4
亚马逊3
Adobe 2
彭博2
苹果9
Facebook 4
Uber 3
Oracle 2
Teltok 2
高盛5
英特尔4
Swiggy 4
绑定3
VMware 3
Qualtrics 3
Intuit 3
Flipkart 2
Zoho 2
三星2
eBay 2
沃尔玛实验室2
Yandex 2
雅虎2
思科2
TCS 2
特斯拉2
C3物联网2
Arcesium 2
肖2
jpmorgan 2
Wix 1
您获得了一个长度为n
的整数height
。有n个垂直线,使得ith
线的两个endpoints
是(i, 0)
和(i, height[i]).
找到与X轴一起形成一个容器的两条线,使容器中包含最多的水。
返回容器可以存储的最大水量。
请注意,您可能不会倾斜容器。
示例2:
输入:高度= [1,8,6,2,5,4,8,3,7]
输出:49
说明:The above vertical lines are represented by array [1,8,6,2,5,4,8,3,7]. In this case, the max area of water (blue section) the container can contain is 49.
示例2:
输入:高度= [1,1]
输出:1
直觉:
代码旨在在直方图中找到两条线之间的最大区域,其中线代表条形的高度。
方法:
- 在直方图的两端初始化指针(在0和最后一个元素处的左POINTER)。
- 左Pointer小于右Pointer:
- 计算左pointer和右pointer在高度形成的线之间的区域。
- 如果当前区域更大。
- 将指向向内较短线的指针移动(向其他指针)。
- 重复步骤2直到指针相遇。
复杂:
时间复杂度: o(n),其中n是高度阵列中的元素数。我们曾经迭代阵列一次。
空间复杂性: o(1),因为我们使用恒定量的额外空间,而不论输入大小如何。
代码:
class Solution {
public int maxArea(int[] height) {
int MaximumArea = 0;
int LeftPointer = 0;
int RightPointer = height.length - 1;
while(LeftPointer < RightPointer){
if(height[LeftPointer] < height[RightPointer]){
MaximumArea = Math.max(MaximumArea , height[LeftPointer] *(RightPointer - LeftPointer));
LeftPointer++;
}
else{
MaximumArea = Math.max(MaximumArea ,height[RightPointer] *(RightPointer - LeftPointer));
RightPointer--;
}
}
return MaximumArea;
}
}
愉快的编码,
湿婆