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

posted @ 2024-11-25 12:48  L1xxer  阅读(22)  评论(0)    收藏  举报