1. 程式人生 > >LeetCode11-盛水最多的容器

LeetCode11-盛水最多的容器

題目:

給定一個高度陣列,找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水。

思路

1. 暴力解法

由於題目中,要求的是找出其中的兩條線,與x軸構成的容器,也就是說,找出陣列中所有可能的兩個高度的組合,很顯然有\frac{n(n-1))}{2}種組合。

具體的遍歷思路

[0] [1-n]

[1] [2-n]

...

程式碼:

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

時間複雜度:O(n^2)

空間複雜度:O(1)

思路2:用雙指標,朝著area可能變大的方向搜尋

我們來看一下area的計算公式 area = min(height[l],height[r])*(r-l)

r-l肯定是不斷減小的

那麼,area主要就是由min(height[l],height[r])這一項決定的,那麼怎樣才能讓這一項變大呢?

顯然,只要讓這裡面的小值變大就行,也就是取裡面的小值,然後變索引,直到遇到比當前height大的索引。

也就是說,把最外邊的兩條height中的小值往大的變。

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

時間複雜度:O(n),只需要掃描一次

空間複雜度:O(1)

這道題的優化思路在於,

目標是得到最大的面積,那麼從area計算的方式出發,向area可能變大的方向搜尋即可。