2025/2/28 【双指针】LeetCode15. 三数之和
1.双指针
我认为实际上应该是三指针。具体来说,以一个i遍历列表,作为第一个数,另外两个左右指针确定第二和第三个数字,逐渐朝中间方向移动,找到所有满足条件的三个数。
from collections import defaultdict class Solution: def threeSum(self, nums: List[int]) -> List[List[int]]: nums.sort() length = len(nums) res = [] for i in range(length-2): # 如果第一个元素已经大于0,不需要进一步检查 if nums[i] > 0: return res # 跳过相同的元素以避免重复 if i > 0 and nums[i] == nums[i-1]: continue left = i + 1 right = length - 1 while left < right: sum = nums[i] + nums[left] + nums[right] if sum > 0: right -= 1 elif sum < 0: left += 1 else: res.append([nums[i], nums[left], nums[right]]) # 跳过相同的元素以避免重复 while left < right and nums[left] == nums[left+1]: left += 1 while left <right and nums[right] == nums[right-1]: right -= 1 left += 1 right -= 1 return res
使用字典的方法就不学习了,懒。
2.使用字典
(好学的本姑娘怎么可能不学呢> < !)
与方法一双指针的思路是大致相同的。只不过这个方法是相当于,首先以一个 i 遍历列表,作为第一个数,然后以一个 j 遍历 i 后面的数,先确定第三个数,不能找到第二个数的第三个数,就先存放到字典中,继续遍历后面的数,
在这个过程中间,去字典中找,是否有满足条件的第二个数,如果有,取用后要从字典中删除。
class Solution: def threeSum(self, nums: List[int]) -> List[List[int]]: nums.sort() length = len(nums) res = [] for i in range(length-2): if nums[i] > 0: break if i > 0 and nums[i] == nums[i-1]: continue d = {} for j in range(i+1, length): # 关于以下的第二个条件,可以考虑nums中有多于3个2的情况 if j > i+2 and nums[j] == nums[j-1] == nums[j-2]: continue c = 0 - (nums[i] + nums[j]) if c in d: res.append([nums[i], c, nums[j]]) d.pop(c) else: d[nums[j]] = j #注意这里字典中各个键存储的值不是nums[j],而是表示索引的j return res
分类:
每日刷题记录
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架