雨水輸送
7616 ワード
Q:高さを入力し、雨上がりにどれだけの水が溜まるかを計算します。
ex)[1,0,2,0,1,1,3]->5(図示)
プール1:ダブルポインタを最大値に移動
def trap(height):
if not height:
return 0
volume = 0
# 투 포인터의 인덱스를 지정( 첫값과 끝값으로 )
left, right = 0, len(height) - 1
left_max , right_max = height[left] , height[right]
#투 포인터가 만날때까지 각각의 최대값 구하는 반복문
while left < right:
left_max, right_max = max(height[left],left_max), max(height[right], right_max)
#더 높은쪽을 향해 투 포인터 이동
if left_max <= right_max:
volume += left_max - height[left]
left += 1
else:
volume += right_max - height[right]
right -= 1
return volume
プール2:スタック
def trap(height):
stack = []
volume = 0
for i in range(len(height)):
# 현재 높이가 이전 높이보다 높을 때 수행되는 반복문
while stack and height[i] > height[stack[-1]]:
top = stack.pop()
# len(stack)이 0일 경우 break
if not len(stack):
break
# 거리 및 높이 구하기
distance = i - stack[-1] -1
waters = min(height[i], height[stack[-1]]) - height[top]
volume += distance * waters
stack.append(i)
return volume
デフォルトでは、for文はスタックリストにスタックごとにインデックスを追加する最初の繰り返し文です. 2つのプールの時間複雑度はO(n)であり,実行時間は同等であった.
Reference
この問題について(雨水輸送), 我々は、より多くの情報をここで見つけました https://velog.io/@junhyeok-5/빗물-트래핑テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol