盛水最多的容器
问题描述:
问题地址:https://leetcode-cn.com/problems/container-with-most-water/
代码:
public int maxArea(int[] height) {
if (height.length <= 1) {
return -1;
}
int i = 0, j = height.length - 1, res = 0;
while (i < j) {
int h = Math.min(height[i], height[j]);
res = Math.max(res, h * (j - i));
if (height[i] < height[j]) {
i++;
} else {
j--;
}
}
return res;
}
分析
我们可以借助消除短板的思想来理解。
这个问题,我们也可以用暴力来求解,只是效率比较差罢了,但是暴力算法是列出了所有的情况,而这个消除短板的算法则排除了很多多余的的情况。
比如,我们选取上面的while循环的一种情况,假设 height[i] < height[j]
,我们先将此时的 height[i]
和 height[j]
与x轴围成的面积给取出来,如果比之前所取到的最大值还要大,那么,就更新最大值,然后,我们就将 i 的值加一,为什么就可以直接将索引往后移动一位了呢?我们可以假设我们还保留着这块短板,那么,除了最初的 height[i]
和 height[j]
围成面积的情况,我们只需要简单思考一下就可以明白其它的任何的 j 左边的板子和 height[i]
组成的面积都不会大于最初的面积,因此,我们就可以直接让 i 的值加一。反之,高板则不能排除。