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