leetcode 力扣 11 盛水最多的容器

78 阅读1分钟

question_11.jpg

贪心双指针
这道题属于会做不会证明。一开始两个指针置于最两端,如果固定矮的那个柱子,那么即使移动另一个指针,水面的高度依然是矮的柱子那么高,哪怕另一个指针指向8848米。
所以可以找出两端中矮的指针,一直移动这个指针,直到找出比这个指针高的柱子,计算面积,比较,保存。

public int maxArea(int[] height) {
        int left = 0, right = height.length - 1;
        int ans = 0;

        while (left < right) {
            int min = Math.min(height[left], height[right]);
            ans = Math.max(ans, (right - left) * min);

            while (left < right && height[left] <= min) {
                left++;
            }

            while (left < right && height[right] <= min) {
                right--;
            }
        }

        return ans;
    }

注意不能写成height[left] < min,否则left和right得不到更新,最外层的while就会一直死循环。

while (left < right && height[left] <= min) {
                left++;
            }