mid 盛最多水的容器

2021-10-05 06:24:42 字數 2527 閱讀 4888

題目

給你 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]

^ ^在初始時,左右指標分別指向陣列的左右兩端,它們可以容納的水量為 \min(1, 7) * 8 = 8min(1,7)∗8=8。

此時我們需要移動乙個指標。移動哪乙個呢?直覺告訴我們,應該移動對應數字較小的那個指標(即此時的左指標)。這是因為,由於容納的水量是由

兩個指標指向的數字中較小值 * 指標之間的距離

兩個指標指向的數字中較小值∗指標之間的距離

決定的。如果我們移動數字較大的那個指標,那麼前者「兩個指標指向的數字中較小值」不會增加,後者「指標之間的距離」會減小,那麼這個乘積會減小。因此,我們移動數字較大的那個指標是不合理的。因此,我們移動 數字較小的那個指標。

有讀者可能會產生疑問:我們可不可以同時移動兩個指標? 先別急,我們先假設 總是移動數字較小的那個指標 的思路是正確的,在走完流程之後,我們再去進行證明。

所以,我們將左指標向右移動:

[1, 8, 6, 2, 5, 4, 8, 3, 7]

^ ^此時可以容納的水量為 \min(8, 7) * 7 = 49min(8,7)∗7=49。由於右指標對應的數字較小,我們移動右指標:

[1, 8, 6, 2, 5, 4, 8, 3, 7]

^ ^此時可以容納的水量為 \min(8, 3) * 6 = 18min(8,3)∗6=18。由於右指標對應的數字較小,我們移動右指標:

[1, 8, 6, 2, 5, 4, 8, 3, 7]

^ ^此時可以容納的水量為 \min(8, 8) * 5 = 40min(8,8)∗5=40。兩指標對應的數字相同,我們可以任意移動乙個,例如左指標:

[1, 8, 6, 2, 5, 4, 8, 3, 7]

^ ^此時可以容納的水量為 \min(6, 8) * 4 = 24min(6,8)∗4=24。由於左指標對應的數字較小,我們移動左指標,並且可以發現,在這之後左指標對應的數字總是較小,因此我們會一直移動左指標,直到兩個指標重合。在這期間,對應的可以容納的水量為:\min(2, 8) * 3 = 6min(2,8)∗3=6,\min(5, 8) * 2 = 10min(5,8)∗2=10,\min(4, 8) * 1 = 4min(4,8)∗1=4。

在我們移動指標的過程中,計算到的最多可以容納的數量為 4949,即為最終的答案。

# cpp

class

solution

else

}return res;}}

;

# python3

class

solution

:def

maxarea

(self, height: list[

int])-

>

int:

l, r =0,

len(height)-1

ans =

0while l < r:

area =

min(height[l]

, height[r])*

(r - l)

ans =

max(ans, area)

if height[l]

<= height[r]

: l +=

1else

: r -=

1return ans

class

solution

:def

maxarea

(self, height)

: i, j, res =0,

len(height)-1

,0while i < j:

if height[i]

< height[j]

: res =

max(res, height[i]

*(j - i)

) i +=

1else

: res =

max(res, height[j]

*(j - i)

) j -=

1return res

盛最多水的容器

給定 n 個非負整數 a1,a2,an,每個數代表座標中的乙個點 i,ai 畫 n 條垂直線,使得垂直線 i 的兩個端點分別為 i,ai 和 i,0 找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水。注意 你不能傾斜容器,n 至少是2。乍一看很簡單,巢狀迴圈遍歷就完事了 int m...

盛最多水的容器

題目描述 給定 n 個非負整數 a1,a2,an,每個數代表座標中的乙個點 i,ai 在座標內畫 n 條垂直線,垂直線 i 的兩個端點分別為 i,ai 和 i,0 找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水 說明 你不能傾斜容器,且 n 的值至少為 2。示例 輸入 1,8,6...

盛最多水的容器

給定 n 個非負整數 a1,a2,an,每個數代表座標中的乙個點 i,ai 在座標內畫 n 條垂直線,垂直線 i 的兩個端點分別為 i,ai 和 i,0 找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水。說明 你不能傾斜容器,且 n 的值至少為 2。圖中垂直線代表輸入陣列 1,8,...