11. 盛最多水的容器
①暴力法
class Solution {
public int maxArea(int[] height) {
int max = Integer.MIN_VALUE;
for(int i = 1; i < height.length; ++i){ // 以i为末边界
for(int j = 0; j < i; ++j){
max = Math.max(max, Math.min(height[i], height[j]) * (i-j));
if(height[j] >= height[i]) break; // height[i]为未边界高度,距离在逐渐减少,height[i]能作为高度就为全局最优解了
}
}
return max;
}
}
②双指针
public class Solution {
public int maxArea(int[] height) {
int l = 0, r = height.length - 1;
int ans = 0;
while (l < r) { // 双指针,两头向中间夹
int area = Math.min(height[l], height[r]) * (r - l);
ans = Math.max(ans, area);
// 小的边界向中间移动,因为不能大的边界向中间移动。因为大边界向中间移动的话,距离减少的同时,高度只会小于等于小边界(木桶定理);而移动小边界,虽然距离减少,但高度存在增大的可能。
if (height[l] <= height[r]) ++l;
else --r;
}
return ans;
}
}