给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/container-with-most-water
输入样例:
读题之后可以发现,矩形面积的高取决于较短边,底边就是两个横坐标的差
这里面积与两个变量有关
left代表左边的横坐标的x,right代表右边的 left<right
height[left] , height[right]代表横坐标对应下的纵坐标y的值,也就是高
我们可以得到:area=min ( height[left] , height[right] ) * (right-left);
(一开始的思路是用两个for遍历,但是超时了,看题解才知道原来可以用双指针)
以下是双指针解法:
左边右边的指针都可以动,怎么确定移动哪一个呢? 在每个状态下,无论长板或短板向中间收窄一格,都会导致水槽 底边宽度 -1 变短:
1.若向内移动短板 ,水槽的短板 可能变大,因此下个水槽的面积可能增大
2.若向内 移动长板 ,水槽的短板 不变或变小,因此下个水槽的面积 一定变小
所以我们只要找到短板,去移动他就行
先将左板置于0号位置,右板置于最后一个位置
如果左板是短板,那么左板往右移
如果右板是短板,那么往左移
class Solution {
public int maxArea(int[] height) {
int max=0;
int left=0,right=height.length-1;
while(left<right)
{
int area=Math.min(height[left],height[right])*(right-left);
max=Math.max(max,area);
if(height[left]<height[right])
{
left++;
}
else
{
right--;
}
}
return max;
}
}