2025/2/28 【双指针】LeetCode15. 三数之和

15. 三数之和 - 力扣(LeetCode)

代码随想录

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
复制代码

 

posted @   axuu  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示