LC011 盛最多水的容器

2021-10-10 05:23:55 字數 1541 閱讀 8789

給你n個非負整數a1,a2,...,a``n,每個數代表座標中的乙個點(i, ai)。在座標內畫n條垂直線,垂直線i的兩個端點分別為(i, ai)(i, 0)。找出其中的兩條線,使得它們與x軸共同構成的容器可以容納最多的水。

**說明:**你不能傾斜容器。

示例 1:

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

輸出:49

解釋:圖中垂直線代表輸入陣列 [1,8,6,2,5,4,8,3,7]。在此情況下,容器能夠容納水(表示為藍色部分)的最大值為 49。

演算法流程:設定雙指標i.j分別位於容器壁兩端,根據規則移動指標(後續說明),並且更新面積最大值 area,直到 i==j時返回area。

指標移動規則與證明:

指標移動規則與證明: 每次選定圍成水槽兩板高度 h[i]h[j]中的短板,向中間收窄 11 格。以下證明:

設每一狀態下水槽面積為 s(i, j),(0 <= i < j < n),由於水槽的實際高度由兩板中的短板決定,則可得面積公式 s(i, j) = min(h[i], h[j]) × (j - i)

在每乙個狀態下,無論長板或短板收窄 1 格,都會導致水槽 底邊寬度 −1:

若向內移動短板,水槽的短板 min(h[i], h[j])可能變大,因此水槽面積 s(i, j)s(i,j) 可能增大。

若向內移動長板,水槽的短板 min(h[i], h[j])不變或變小,下個水槽的面積一定小於當前水槽面積。

因此,向內收窄短板可以獲取面積最大值。換個角度理解:

因為短指標已經限制了高度,如果移動高指標不可能增加整體的高度,而底在不斷減少,所以移動短指標來嘗試增加最大高度

class

solution

return area;

}}

複雜度分析

LeetCode011 盛最多水的容器

給定 n 個非負整數 a1,a2,an,每個數代表座標中的乙個點 i,ai 畫 n 條垂直線,使得垂直線 i 的兩個端點分別為 i,ai 和 i,0 找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水。可以使用兩端各乙個指標移動進行計算 定義 i 和 j 兩個指標分別指向陣列的左右兩...

盛最多水的容器

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