力扣42 接雨水 python解法總結

2021-10-24 10:51:27 字數 2872 閱讀 5287

對每乙個格仔進行推算,根據左右最高的格仔數來計算能接水的單位數,最後逐一相加

class solution:

def trap(self, height: list[int]) -> int:

ans = 0

for i in range(len(height)):

max_left, max_right = 0,0

# 尋找 max_left

for j in range(0,i):

max_left = max(max_left,height[j])

# 尋找 max_right

for j in range(i,len(height)):

max_right = max(max_right,height[j])

if min(max_left,max_right) > height[i]:

ans += min(max_left,max_right) - height[i]    

return ans

在暴力解題的基礎上,使用陣列來放置maxleft和maxright,降低時間複雜度,遍歷次數大大減少

class solution:

def trap(self, height: list[int]) -> int:

# 邊界條件

if not height: return 0

n = len(height)

maxleft = [0] * n

maxright = [0] * n

ans = 0

# 初始化

maxleft[0] = height[0]

maxright[n-1] = height[n-1]

# 設定備忘錄,分別儲存左邊和右邊最高的柱子高度

for i in range(1,n):

maxleft[i] = max(height[i],maxleft[i-1])

for j in range(n-2,-1,-1):

maxright[j] = max(height[j],maxright[j+1])

# 一趟遍歷,比較每個位置可以儲存多少水

for i in range(n):

if min(maxleft[i],maxright[i]) > height[i]:

ans += min(maxleft[i],maxright[i]) - height[i]

return ans

接完雨水後的圖形,看起來會有很明顯的特點,從前後分別往中間靠,一定是遞增的,一直到最高點

所以分設兩個指標left,right,從前後分別向中間移動,在遇到較之前大的數字後停下,兩個指標進行計算right-left+1得出這一層的單元塊有多少個,然後將每一層的塊數加起來,就是接水後的塊數,再減去輸入的塊數,就是雨水的單位數,**如下

while(left<=right and height[left]=left and height[right]另外解法三也可以改進一下,因為你會發現,如果兩個指標相對移動的同時,分別記錄遇到的最大值,然後每一輪都將他們的值相加,最後的結果會是以max(list)和len(list)為邊長的矩形格仔數加上接雨水後的圖形,看下圖

紅線和黃線分別是left和right指標移動路線的值

如圖分成四個塊,要求的是灰色部分的單位塊數,由大矩形塊數減去黑色部分也就是輸入的列表的求和,再減去紅色和淡藍色的部分,這兩部分分別是從前和後向中間遍歷到最高點,記錄最大值與最高點的差值

class solution:

def trap(self, height: list[int]) -> int:

if not height: return 0

max_h = max(height)

rain = max_h * len(height) - sum(height)

m_h = 0

for h in height:

if h >= max_h: break

if h > m_h: m_h = h

rain -= max_h - m_h

m_h = 0

for h in reversed(height):

if h >= max_h: break

if h > m_h: m_h = h

rain -= max_h - m_h

return rain

!!!本文參考了力扣大神的解法,特此說明!!!

力扣 42 接雨水

題目 給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖,計算按此排列的柱子,下雨之後能接多少雨水。上面是由陣列 0,1,0,2,1,0,1,3,2,1,2,1 表示的高度圖,在這種情況下,可以接 6 個單位的雨水 藍色部分表示雨水 感謝 marcos 貢獻此圖。示例 輸入 0,1,0,2,1,...

力扣第42題 接雨水

原文是帶著講解,過程還算詳細 上題是乙個對題目的舉例說明 本次解題中用這個圖 我認為這個圖涵蓋了可能出現的情況,講解會比較好一點 第一種方法是暴力法,時間複雜度為o n 2 空間複雜度為o 1 public inttrap02 int height int max right 0 找出右邊最高 fo...

力扣 42 接雨水 常考

題目 給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖,計算按此排列的柱子,下雨之後能接多少雨水。示例 1 輸入 height 0,1,0,2,1,0,1,3,2,1,2,1 輸出 6 解釋 上面是由陣列 0,1,0,2,1,0,1,3,2,1,2,1 表示的高度圖,在這種情況下,可以接 6 ...