[leet 42]2つのポインタ、1つずつ移動
leetcode 42. Trapping Rain Water
上の問題のように,中間容器の幅を求めるという問題では,両端に2つのポインタを置き,内側に縮小し,幅を求める.まずこの方法を覚えてから、まず考えたほうが便利です.
今回の42番目の問題も同じですが、2つのポインタが同時に1つの格を移動している間に、しばらくうろうろしていました.2つのポインタが出会うと,双方が行うmax heightが異なるため,処理すべき例外事項は1,2つではない.一つ一つ移動する方法に変えて、本当に簡単に解けました.
PSEUDO
両端ダブルポインタの使用
左<右、左/右、右/右、左/右それぞれ1マスずつ移動
height[左+1]left_temp += left_max-height[left+1]
Else:(より大きいか等しい場合はtemp決済)
ans += left_temp
left_temp = 0
left_max = height[left+1]
left += 1
(右側で同様の操作を行います)
最後に移動しながら会うとans+left temp+right tempを加えて戻ります
tempはいらないかもしれませんが、ansに直接付けても大丈夫です.
2つの位置が同時に1つのグリッドを移動すると、2つの最大値が異なるため、中間で複雑になります.(問題を解くのが難しい)一人一人!
上の問題のように,中間容器の幅を求めるという問題では,両端に2つのポインタを置き,内側に縮小し,幅を求める.まずこの方法を覚えてから、まず考えたほうが便利です.
今回の42番目の問題も同じですが、2つのポインタが同時に1つの格を移動している間に、しばらくうろうろしていました.2つのポインタが出会うと,双方が行うmax heightが異なるため,処理すべき例外事項は1,2つではない.一つ一つ移動する方法に変えて、本当に簡単に解けました.
Question
Solution
PSEUDO
両端ダブルポインタの使用
左<右、左/右、右/右、左/右それぞれ1マスずつ移動
height[左+1]
Else:(より大きいか等しい場合はtemp決済)
ans += left_temp
left_temp = 0
left_max = height[left+1]
left += 1
(右側で同様の操作を行います)
最後に移動しながら会うとans+left temp+right tempを加えて戻ります
2つの位置が同時に1つのグリッドを移動すると、2つの最大値が異なるため、中間で複雑になります.(問題を解くのが難しい)一人一人!
from typing import List
def trap(height: List[int]) -> int:
if len(height) <= 2: return 0
left_idx = 0
right_idx = len(height)-1
ans = 0
left_temp, right_temp = 0, 0
left_max, right_max = height[0], height[-1]
while left_idx < right_idx:
if left_max <= right_max:
if height[left_idx+1] < left_max:
left_temp += (left_max - height[left_idx+1])
else:
ans += left_temp
left_temp = 0
left_max = height[left_idx+1]
left_idx += 1
else:
if height[right_idx-1] < right_max:
right_temp += (right_max - height[right_idx-1])
else:
ans += right_temp
right_temp = 0
right_max = height[right_idx-1]
right_idx -= 1
return ans + left_temp + right_temp
githubReference
この問題について([leet 42]2つのポインタ、1つずつ移動), 我々は、より多くの情報をここで見つけました https://velog.io/@jonas-jun/leet42-trapRainテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol