leetcode有一点好,不用写很多空值判断啥玩意的,这里n值和高度都是有效值,只考虑我们的思路就好了。
思路:
双指针法,每次保留较大值,知道左右边界相交判断完全部的值!
首先定义俩指针分别指向最左和最右的那个柱子。那么水的宽度是两根柱子之间的距离 d = 8d=8;水的高度取决于两根柱子之间较短的那个,即左边柱子的高度 h = 3h=3。水的面积就是 3 * 8 =24。
那么如果选择固定一根柱子,另外一根变化,水的面积会有什么变化吗?稍加思考可得:
- 当前柱子是最两侧的柱子,水的宽度 dd 为最大,其他的组合,水的宽度都比这个小。
- 左边柱子较短,决定了水的高度为 3。如果移动左边的柱子,新的水面高度不确定,一定不会超过右边的柱子高度 7。
- 如果移动右边的柱子,新的水面高度一定不会超过左边的柱子高度 3,也就是不会超过现在的水面高度。
因此我们可以发现,我们知道较短的一根柱子固定后,长柱向内移动必然会使值更小,因此我们可以丢弃短柱,去探索长柱留下的情况下有没有最大值。
总结:
这里思路其实不是去一下子找到什么最大值,而是每次排除不可能产生最大值的情况,留下可能产生最大值的区域。
代码:
public int maxArea(int[] height) {
int left=0,right=height.length-1;
int res=0;
while (left<right){
int s=(Math.min(height[left],height[right]))*(right-left);
res=Math.max(res,s);
if (height[left]<height[right]){
left++;
}else {
right--;
}
}
return res;
}
网友评论