LeetCode 11題盛最多水的容器

2021-10-02 12:55:29 字數 2946 閱讀 7829

給定 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。接下來...