給你 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
設定兩個指標left、right(它們所指向的元素值分別記為x、y),開始時,left指向陣列的第乙個元素,right指向陣列的最後乙個元素,兩指標指向的位置代表容器的左右邊界,由以下公式計算出此時的可以容納的水量:
然後將x、y中較小值對應的指標向另乙個指標的方向移動(至於為什麼要移動較小值對應的指標稍後會做出證明),然後按照上面的公式計算出此時可以容納的水量。繼續移動x、y較小值對應的指標,每移動一次都要計算出此時可以容納的水量,直到left與right相遇。最終的答案即為每一次以left、right為左右邊界計算出的可以容納水量中的最大值。
為什麼要移動較小值對應的指標?
證明:記當前左右指標指向的元素值分別為 x0x_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,...