思路:
定义两个指针 left 和 right ,开始分别让他们指向数组的最左边和最右边,代表容器的最大边界,然后设left所指的值为x,right所指的指为y。
假设下 x <= y 则当前容器体积为 v = min(x,y)×(right-left),即 x×(right-left),然后移动右指针到任意位置,这时右指针指向了y1。
v1 = min(x,y1)×(right-left)
当 y1 >= y 时,min(x,y1) = x,而 right-left 变小了,v1 < v
当 y1 < y 时,min(x,y1)<=y,right-left变小,v1 < v
因此,无论如何移动右指针,容积都会变小,所以就不能再以做指针为容器的边界。
所以,因该移动左指针,这样以左指针为边界的所有情况。
依次类推,每次都移动短板,就可以找到最大容积
class Solution {
public int maxArea(int[] height) {
int left = 0;
int right = height.length-1;
int v,maxV = 0;
while(left < right) {
v = Math.min(height[left],height[right])*(right-left);
if(v > maxV) maxV = v;
int i = height[left] > height[right]? right-- : left++;
}
return maxV;
}
}
参考题解:
[https://leetcode-cn.com/problems/container-with-most-water/solution/on-shuang-zhi-zhen-jie-fa-li-jie-zheng-que-xing-tu/]
反思:
再验证方法的正确性时,试着举例将所有情况画出来。