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;
    }
}

可容纳的水取决于两点:高度和长度。那么我们一开始就将两个指针放在数组两端,长度是最长的,影响因素就只有高度了。如果我们将两个指针中高的往中间移,那么长度减小,高度也不会增加,没有意义。所以如果能容纳更多的水,一定是将低的往中间移,才能在长度减小的情况下,找到更高的点,增加水的容量。

posted @ 2021-01-24 11:06  一天到晚睡觉的鱼  阅读(84)  评论(0)    收藏  举报