1. 程式人生 > >LeetCode 11. 盛最多水的容器 Container With Most Water (C語言)

LeetCode 11. 盛最多水的容器 Container With Most Water (C語言)

題目描述:

給定 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

題目解答:

方法1:雙支針(找短板)

裝的水取決於最短的板長

橫向長度。記錄左右兩個位置,開始時,一個置於起始位置,另一個置於末尾位置。先比較這兩個位置組成的容積與最大容積值,判斷是否需要更新最大容積。接下來為了嘗試增大容積,我們將左右兩個位置中短的那個向中間挪動(如果挪動長的那個,挪動之後容積必定減小,所以挪動沒有意義。相反挪動短的那個,有可能產生更大的容積),此時繼續計算容積,判斷是否需要更新,一直這樣挪動最短的那個位置,直到兩位置重合,返回最大值。執行時間4ms,程式碼如下。

#define min(a, b) (a > b ? b : a)
int maxArea(int* height, int heightSize) {
    int
left = 0, right = heightSize - 1; int max = -1, now = 0; while(left < right) { now = (right - left) * min(height[left], height[right]); if(now > max) max = now; if(height[left] < height[right]) left++; else right--; }
return max; }