题目链接 :11. 盛最多水的容器 - 力扣(LeetCode) (leetcode-cn.com)
根据题意可知要求 max{(j-i)*min{yj,yi}}
由于要求的最大值是乘法运算,只能遍历所有可能的情况
同时由于x值是有序的,可以根据(j-i)来遍历
开始时start = 0,end = height.length-1,记area = (start,height[start]),(end,height[end])围成的面积
下面分三种情况(start>=end时退出判断)
一:height[start] <= height[end] 且 height[start] < height[start+1]时(start+1,height[start+1]),(end,height[end])围成的面积不一定比area小.
start++,然后重新判断属于哪种情况
二:height[end] < height[start] 且 height[end] < height[end-1]时(start,height[start]),(end-1,height[end-1])围成的面积不一定比area小.
end--,然后重新判断属于哪种情况
三:既不属于第一种情况也不属于第二种情况时,(start+1,height[start+1]),(end,height[end])和(start,height[start]),(end-1,height[end-1])围成的面积都比area小,但是在start和end之间可能会有面积更大的区域。此时判断height[start]和height[end]的大小,如果height[start]较小,那么(start,height[start])同[start,end]区间内任一点围成的区域都比area小,height[end]较小和height[start]=height[end]时同理.
所以此时判断若:
height[start]>=height[end] end--;
height[start]<=height[end] start++;
然后重新判断属于哪种情况
class Solution {
private int res;
public int maxArea(int[] height) {
if(height.length == 0) return 0;
int start = 0,end = height.length-1;
res = end * Math.min(height[start],height[end]);
fun(height,start,end);
return res;
}
void fun(int[] height,int start,int end){
while (start<end) {
if (height[start] <= height[end] && height[start] < height[start+1]) {
start += 1;
res = Math.max(res,(end-start)*Math.min(height[start],height[end]));
} else if(height[end] < height[start] && height[end] < height[end-1]){
end -= 1;
res = Math.max(res,(end-start)*Math.min(height[start],height[end]));
} else {
if(height[start] <= height[end]) start += 1;
if(height[start] >= height[end]) end -= 1;
}
}
}
}