給定 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
「」"盛最多水的容器
如果用最暴力的方法,那就是計算任意兩個數作為答案可以容納的水,然後
找到最大值作為結果輸出,這樣的時間複雜度為 n²,結果執行出來的結果是時間超時,所以要尋找更優速度
然後我發現了乙個規律,左邊的那個值,如果大小再下降,那麼就直接跳過就可以了,右邊的那個值,如果大小再
上公升,那麼這個值也可以跳過就行了。可以仔細想想是不是這樣。 可是結果還是時間超時,媽的我太蠢了
看到別人說的雙指標法,發現上面的解法已經有點接近了,但還是不如雙指標來的簡單,上面的複雜度還是n²的複雜度
雙指標法:也就是在起始端和末端都安排乙個指標,然後兩個指標分別根據情況來向內側移動,不斷計算容器大小來
更新最大值,這樣指標交錯就可以結束遍歷了,這樣的話時間複雜度就只有 o(n)了
這次方法終於時間通過了,**中還可以詳細新增判斷條件,如果右移的值還沒有左邊大,那麼就不用計算本次容器值了,同樣的
如果左移的值還沒有右邊大,那也不用計算本次容器值了。因為不可能大於當前的最大值
from typing import list
# class solution:
# def maxarea(self, height: list[int]) -> int:
# max = 0
# for i in range(len(height)-1):
# # 用氣泡排序的方式來分別計算容器體積
# for j in range(i+1,len(height)):
# num = min(height[i], height[j]) * (j-i)
# if num > max:
# max = num
# return max
from typing import list
# class solution:
# def maxarea(self, height: list[int]) -> int:
# max = 0
# for i in range(len(height)-1):
# # 如果它比左邊的數小,那麼直接跳到下次迴圈
# if i > 0 and height[i] < height[i-1]:
# continue
# for j in range(i+1,len(height)):
# # 如果它右邊的數比它大,那麼這個數也可以直接跳過了
# if j < len(height)-1 and height[j] < height[j+1]:
# continue
# num = min(height[i], height[j]) * (j-i)
# if num > max:
# max = num
# return max
from typing import list
class solution:
def maxarea(self, height: list[int]) -> int:
left = 0
right = len(height)-1
max = min(height[0], height[len(height) - 1]) * (right - left)
while left < right:
# 迴圈終止條件如上
if height[left] < height[right]:
# 左邊的值限制了容器大小,則左指標往右移動,並且可以加上條件,如果右移的值
# 如果右移的值還沒有左邊大,那麼就不用計算本次容器值了,
left = left +1
# while height[left] < height[left+1] and (left+1)max:
max = num
else:
# 右邊的值限制了容器大小,右指標往左移動,並且加上條件,如果左移的值
# 如果左移的值還沒有右邊大,那也不用計算本次容器值了。因為不可能大於當前的最大值
right = right -1
# while height[right] > height[right-1] and (right-1)>left:
# right = right -1
num = min(height[left], height[right]) * (right - left)
if num > max:
max = num
return max
a = [1,8,6,2,5,4,8,3,7]
solu = solution()
answer = solu.maxarea(a)
print(answer)
還是得多刷題,題目感覺不難,但是想要通過或者說找到簡便答案有時候還是得多刷題,才能漸漸熟悉。
fighting
leetcode11 盛最多的水
題意 給出乙個陣列表示乙個容器,陣列中的每個數字表示容器中每個柱子的高度,每兩根柱子中的間距為1,問該容器最大的盛水量。思路1 暴力法 最簡單的思路就是暴力遍歷,乙個迴圈從頭到尾,乙個迴圈從尾到上乙個迴圈指向的位置,計算每兩根柱子之間的盛水量,將最大的盛水量返回。public int maxarea...
leetcode 11 盛最多的水
給你 n 個非負整數 a1,a2,an,每個數代表座標中的乙個點 i,ai 在座標內畫 n 條垂直線,垂直線 i 的兩個端點分別為 i,ai 和 i,0 找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水。說明 你不能傾斜容器,且 n 的值至少為 2。圖中垂直線代表輸入陣列 1,8,...
LeetCode 11 題 盛水最多的容器
廢話不多說,先是題目描述 給定 n 個非負整數 a1,a2,an,每個數代表座標中的乙個點 i,ai 在座標內畫 n 條垂直線,垂直線 i 的兩個端點分別為 i,ai 和 i,0 找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水。說明 你不能傾斜容器,且 n 的值至少為 2。接下來...