LeetCode.11-裝水最多的容器(Container With Most Water)

這是悅樂書的第350次更新,第375篇原創

java

01 看題和準備

今天介紹的是LeetCode算法題中Medium級別的第5題(順位題號是11)。給定n個非負整數a1,a2,…,an,其中每一個表示座標(i,ai)處的點。繪製n條垂直線,使得線i的兩個端點位於(i,ai)和(i,0)。找到兩條線,它們與x軸一塊兒造成一個容器,這樣容器就含有最多的水。算法

注意:您可能不會傾斜容器,n至少爲2。

上面的垂直線由數組[1,8,6,2,5,4,8,3,7]表示。 在這種狀況下,容器可容納的最大水面積(藍色部分)爲49。例如:數組

輸入:[1,8,6,2,5,4,8,3,7]
輸出:49

數據結構

02 第一種解法

暴力解法,使用兩層循環,裝水容器的寬爲兩元素索引之差,高爲兩元素中的較小值,利用寬乘以高,計算容器的面積,取其中較大值返回。3d

此解法的時間複雜度是O(N^2),空間複雜度爲O(1)指針

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


03 第二種解法

雙指針。定義兩個變量,一個從數組的頭部開始,記爲start,另一個從尾部開始,記爲end,依舊按照第一種解法中那樣計算面積和取最大值,而後來判斷哪一個指針該往哪一個方向移動。code

若是start位置的元素值小於end位置的元素值,那麼start位置須要找到一個更大的值,纔有可能比當前的面積大,因此start須要自增1,向end方向移動,反之就是end位置須要向start位置方向移動,來找到一個更大的元素值。blog

此解法的時間複雜度是O(N),空間複雜度爲O(1)索引

public int maxArea2(int[] height) {
    int start = 0, end = height.length-1;
    int result = 0;
    while (start < end) {
        int w = end - start;
        int h = Math.min(height[end], height[start]);
        result = Math.max(result, w*h);
        if (height[start] < height[end]) {
            start++;
        } else {
            end--;
        }
    }
    return result;
}


04 第三種解法

若是你以爲第二種解法中,沒有討論兩邊的元素相等時的狀況,那咱也能夠再多加一個判斷。class

public int maxArea3(int[] height) {
    int start = 0, end = height.length-1;
    int result = 0;
    while (start < end) {
        int w = end - start;
        int h = Math.min(height[end], height[start]);
        result = Math.max(result, w*h);
        if (height[start] < height[end]) {
            start++;
        } else if(height[start] > height[end]) {
            end--;
        } else {
            start++;
            end--;
        }
    }
    return result;
}


05 小結

算法專題目前已連續日更超過六個月,算法題文章218+篇,公衆號對話框回覆【數據結構與算法】、【算法】、【數據結構】中的任一關鍵詞,獲取系列文章合集。

以上就是所有內容,若是你們有什麼好的解法思路、建議或者其餘問題,能夠下方留言交流,點贊、留言、轉發就是對我最大的回報和支持!

相關文章
相關標籤/搜索