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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构