對每乙個格仔進行推算,根據左右最高的格仔數來計算能接水的單位數,最後逐一相加
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 ...