https://leetcode.cn/problems/container-with-most-water/
题目描述
给定一个长度为 n
的整数数组 height
。有 n
条垂线,第 i
条线的两个端点是 (i, 0)
和 (i, height[i])
。
找出其中的两条线,使得它们与 x
轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。
示例:
思路
1.暴力解法
把每一种情况都获取到,然后从中选出最大的值,两层循环直接完成,但是该算法会超时
2.优化解法
可以使用双指针思路,定义左右指针,遍历列表,计算容积
容器的容积公式是 底*高,比如下面这种情况:
代码
//暴力
public static int maxArea(int[] height) {
int max = 0;
for(int i=0;i<height.length;i++){
for(int j = i+1;j<height.length;j++){
int h = height[i]<height[j]?height[i]:height[j];
int v = (j-i)*h;
if (v>max){
max=v;
}
}
}
return max;
}
//优化
public static int maxArea(int[] height) {
int left = 0;
int right = height.length-1;
//先求出左右两边的容积
int h = height[left]<height[right]?height[left]:height[right];
int w = right-left;
int max = h*w;
//遍历列表,一定left和right
while (left<right){
if (height[left]<height[right]){
left++;
}else {
right--;
}
h = height[left]<height[right]?height[left]:height[right];
w = right-left;
if (max<h*w){
max = h*w;
}
}
return max;
}