local max = (j - i) * Math.min(h[j],h[i]);
因此,乘号两边任何一个参数变大,都可能有最大值
如果我们从左往右扫,j-i 是一定在增大,无论后边那个参数如何变化,都有肯能其中一个端点,因此这么做的复杂度是O(n^2)
如果用两个指针从两边向中间走,那么可以保证左边参数一定是在减小的!!(控制变量)
因此只需要Math.min(h[j],h[i]) 增大即可找到最大值。
public class Solution {
public int maxArea(int[] height) {
int i = 0, j = height.length - 1,max = 0;
while(i < j){
max = Math.max(max, (j-i) *Math.min(height[j],height[i]));
if(height[i] <= height[j]) i++;
else j--;
}
return max;
}
}
没有评论:
发表评论