chaoxi_todo.jpg
題目
給你 n 個非負整數 a1,a2,...,an,每個數代表坐標中的一個點 (i, ai) 。在坐標內畫 n 條垂直線,垂直線 i 的兩個端點分別為 (i, ai) 和 (i, 0)。找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水。
說明:你不能傾斜容器,且 n 的值至少為 2。
給你 n 個非負整數 a1,a2,...,an,每個數代表坐標中的一個點 (i, ai) 。在坐標內畫 n 條垂直線,垂直線 i 的兩個端點分別為 (i, ai) 和 (i, 0)。找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水。
說明:你不能傾斜容器,且 n 的值至少為 2。
image
圖中垂直線代表輸入數組 [1,8,6,2,5,4,8,3,7]。在此情況下,容器能夠容納水(表示為藍色部分)的最大值為 49。
示例:
輸入:[1,8,6,2,5,4,8,3,7] 輸出:49
題解
思路1:暴力破解,雙層for循環,枚舉所有情況
時間復雜度:O(n^2)
def maxArea(self, height: List[int]) -> int:
res = 0
for i in range(len(height)):
for j in range(i+1,height):
res = max(res, (j-i)*min(height[i], height[j]))
return res
執行結果:超出時間限制
顯示詳情
最后執行的輸入:
[488,8584,8144,7414,6649,3463,3453,8665,8006,1313,3815,7404,6
思路2:雙指針法,根據規則移動指針,并更新最大面積res
時間復雜度:O(n)
def maxArea(self, height: List[int]) -> int:
res, l, r = 0, 0, len(height)-1
while True:
if l>=r:
break
res = max(res, min(height[l], height[r])*(r-l))
if height[l]>height[r]:
r -= 1
else:
l += 1
return res
執行結果:通過
顯示詳情
執行用時 :72 ms, 在所有 Python3 提交中擊敗了70.29%的用戶
內存消耗 :15.1 MB, 在所有 Python3 提交中擊敗了6.90%的用戶