0x03 Leetcode Hot100 双指针
方法论
关键是要找每个状态的性质,从而移动指针。
总结
- 移动零 一前一后。前面的遍历数组,后面的维护条件,后指针对值的修改不会影响前指针的遍历。
- 盛最多水的容器 一左一右。每次移动一个指针计算当前结果。
- 三数之和 一左一右。需要考虑的点:如何去重。
- 接雨水 一左一右。每次移动值更小的指针(因为最大值不会变小)计算当前结果。(对双指针缺乏练习,一开始没想到,只能用单调栈做出来,附代码。)
class Solution:
def trap(self, height: List[int]) -> int:
stack = []
ret = 0
for i in range(len(height)):
while stack and height[i] > stack[-1][1]:
pre = stack.pop()
if not stack:
break
a = i - stack[-1][0] - 1
b = min(height[i], stack[-1][1]) - pre[1]
ret += a * b
stack.append((i, height[i]))
return ret

浙公网安备 33010602011771号