LeetCode 11 Container With Most Water

时间:2022-02-25 19:01:05

首先想到的还是暴力解决方法,双循环如下:

class Solution {
    public int maxArea(int[] height) {
        int i = 0, j = 0;
        int maxArea = 0;
        for(i = 0; i < height.length; i++){
            for(j = i+1; j < height.length; j++){
                maxArea = Math.max(maxArea, Math.min(height[i], height[j]) * (j - i));
            }    
        }
        return maxArea;
    }     
}

当然这样肯定不行,O(n^2)复杂度。接下来考虑如何找到正确的解题思路。我们考虑什么情况下的计算是没有必要的。蓄水的多少取决于短板的长度以及两块板的距离,所以当某一个时刻左边的板短时,右边的板可以固定,让左边的板右移1位。原因是右边的板如果左移,无论左移几位一定没有原本的大(因为此时短板长度不变,距离减小)。左板大时相同。去掉这些计算过程将使时间复杂度降低。即考虑双指针方法,解法如下:

class Solution {
    public int maxArea(int[] height) {
        int left = 0, right = height.length -1;
        int maxArea = 0;
        while(right > left){
            maxArea = Math.max(maxArea, Math.min(height[left], height[right]) * (right - left));
            if(height[right] > height[left]){
                left += 1;
            }else{
                right -= 1;
            }
        }  
        return maxArea;
    }     
}