11. 盛水最多的容器 - LeetCode
11. 盛水最多的容器
暴力解法
class Solution {
public int maxArea(int[] height) {
int n = height.length;
int ans = 0;
for(int i = 0; i < n-1; i++){
for(int j = i+1; j < n; j++){
ans = Math.max(ans, Math.min(height[i], height[j]) * (j-i));
}
}
return ans;
}
}
枚举左端点,从左端点开始枚举右端点,计算可容纳的水。
双指针解法
class Solution {
public int maxArea(int[] height) {
int n = height.length;
int i = 0, j = n - 1;
int ans = 0;
do{
ans = Math.max(ans, Math.min(height[i], height[j]) * (j - i));
if(height[i] < height[j]){
i++;
} else{
j--;
}
}while(j > i);
return ans;
}
}
可容纳的水取决于两点:高度和长度。那么我们一开始就将两个指针放在数组两端,长度是最长的,影响因素就只有高度了。如果我们将两个指针中高的往中间移,那么长度减小,高度也不会增加,没有意义。所以如果能容纳更多的水,一定是将低的往中间移,才能在长度减小的情况下,找到更高的点,增加水的容量。

浙公网安备 33010602011771号