LeetCode P11 盛最多水的容器

2021-10-23 14:53:47 字數 2177 閱讀 8467

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

思路首先將使用雙指標來解決這個問題的方法講解一遍,再證明這種做法的正確性。

設定兩個指標leftright(它們所指向的元素值分別記為xy),開始時,left指向陣列的第乙個元素,right指向陣列的最後乙個元素,兩指標指向的位置代表容器的左右邊界,由以下公式計算出此時的可以容納的水量:

然後將xy中較小值對應的指標向另乙個指標的方向移動(至於為什麼要移動較小值對應的指標稍後會做出證明),然後按照上面的公式計算出此時可以容納的水量。繼續移動xy較小值對應的指標,每移動一次都要計算出此時可以容納的水量,直到leftright相遇。最終的答案即為每一次以leftright為左右邊界計算出的可以容納水量中的最大值。

為什麼要移動較小值對應的指標?

證明:記當前左右指標指向的元素值分別為 x

0x_0

x0​、y

0y_0

y0​,不妨假設 x

0x_0x0

​​,左右指標之間的距離為 d

0d_0

d0​,則此時可容納的水量為: v0=

min(

x0,y

0)⋅d

0=x0

⋅d0v_0=min(x_0,y_0)\cdot d_0=x_0\cdot d_0

v0​=mi

n(x0

​,y0

​)⋅d

0​=x

0​⋅d

0​若將右指標向左移動,使其指向 y

1y_1

y1​,則此時可容納的水量為 v1=

min(

x0,y

1)⋅(

d0−1

)v_1=min(x_0,y_1)\cdot (d_0-1)

v1​=mi

n(x0

​,y1

​)⋅(

d0​−

1)所以移動右指標(或者說移動較大值對應的指標),一定會導致得到的可容納的水量小於未移動之前的可容納水量。

若將左指標向右移動,使其指向 x

1x_1

x1​,則此時可容納的水量為 v2=

min(

x1,y

0)⋅(

d0−1

)v_2=min(x_1,y_0)\cdot (d_0-1)

v2​=mi

n(x1

​,y0

​)⋅(

d0​−

1)所以移動左指標(或者說移動較小值對應的指標),可能會得到的可容納的水量大於未移動之前的可容納水量。

所以我們應該移動較小值對應的指標。

演算法

class

solution

else

}return ans;}}

;

複雜度分析假設陣列中元素的個數為 nnn

11 盛最多水的容器

一 題意 給定 n 個正整數 a1,a2,an,其中每個點的座標用 i,ai 表示。畫 n 條直線,使得線 i 的兩個端點處於 i,ai 和 i,0 處。請找出其中的兩條直線,使得他們與 x 軸形成的容器能夠裝最多的水。注意 你不能傾斜容器,n 至少是2。二 分析和解答 1 顯然是求x軸的距離乘以較...

11 盛最多水的容器

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

11 盛最多水的容器

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