4 盛最多水的容器(中等)

2021-10-25 07:18:32 字數 2010 閱讀 8065

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

輸出:49

ps:這道題沒做出來,最後看的別人的題解

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

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

設每一狀態下水槽面積為 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) 可能增大。

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

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

若不指定移動規則,所有移動出現的 s(i, j) 的狀態數為 c(n, 2),即暴力列舉出所有狀態。

在狀態 s(i, j) 下向內移動短板至 s(i + 1, j)(假設 h[i] < h[j] ),則相當於消去了 狀態集合。而所有消去狀態的面積一定 <= s(i, j):

短板高度:相比 s(i, j) 相同或更短(<= h[i]);

底邊寬度:相比 s(i, j) 更短。

因此所有消去的狀態的面積都 < s(i, j)。通俗的講,我們每次向內移動短板,所有的消去狀態都不會導致丟失面積最大值 。

複雜度分析:

時間複雜度 o(n),雙指標遍歷一次底邊寬度 n 。

空間複雜度 o(1),指標使用常數額外空間。

class

solution

: def maxarea

(self, height: list[int])-

> int:

''' 雙指標法:

初始 i 在資料最左端,j 在陣列最右端,得到初始最大能容納的水,然後比較i和j的高度,

將較矮的一方往中間移動乙個位置,算出此時能容納的水,並將其與最大能容納的水比較

並更新將較矮的一方往中間移動乙個位置的數學原理:假設之前i、j的高度分別為:x,y

leetcode題 11 盛最多水的容器(中等)

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

盛最多水的容器

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