leetcode 15:三数之和(python)

题目

给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。

注意:答案中不可以包含(元素)重复的三元组。

例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法一

  • 思路
    先将数组排序
    定义三个指针:p1、p2、p3(p1<=p2<=p3
    其中p1遍历整个数组,那么这个问题就可以转化为在p1之后的数组中寻找合适的p2、p3,使得
    nums[p2]+nums[p3]=-nums[p1]
    若<,因为p3指向的数只会减少,所以p2增加;
    同理,若>,p3减小
    其中,若nums[p2]==nums[p2-1]nums[p3]==nums[p3+1],为使不出现重复的三元组,p2、p3也应移动

  • 代码

class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        nums.sort()
        res =[]
        lens=len(nums)
        for p1 in range(lens-2):
            if p1>0 and nums[p1]==nums[p1-1]:
                continue
            p2=p1+1
            p3=lens-1
            while(p2<p3):
                isum=nums[p1]+nums[p2]+nums[p3]
                if isum==0:
                    res.append([nums[p1],nums[p2],nums[p3]])
                    p2+=1
                    p3-=1
                    while p2<p3 and nums[p2]==nums[p2-1]:
                        p2+=1
                    while p2<p3 and nums[p3]==nums[p3+1]:
                        p3-=1
                elif isum<0:
                    p2+=1
                else:
                    p3-=1
        return res
  • 结果
    在这里插入图片描述

解法二(改进)

  • 思路
    其实p1只要到0点就可以结束循环了
    若nums[p3]<=nums[p2]<=nums[p1]<0,
    则sum必大于0
  • 代码
class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        nums.append(1)
        nums.sort()
        k0=nums.index(1)
        del nums[k0]
        res =[]
        lens=len(nums)
        for p1 in range(k0):
            if p1>0 and nums[p1]==nums[p1-1]:
                continue
            p2=p1+1
            p3=lens-1
            while(p2<p3):
                isum=nums[p1]+nums[p2]+nums[p3]
                if isum==0:
                    res.append([nums[p1],nums[p2],nums[p3]])
                    p2+=1
                    p3-=1
                    while p2<p3 and nums[p2]==nums[p2-1]:
                        p2+=1
                    while p2<p3 and nums[p3]==nums[p3+1]:
                        p3-=1
                elif isum<0:
                    p2+=1
                else:
                    p3-=1
        return res
  • 结果
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值