LeetCode 15三数之和

题目描述

题目描述

解题

首先将数组进行排序,并确定第一个数(最小),第二第三分别取第一个数右边数组的第一nums[L]和最后一个数nums[R],第一个数必须小于0,
若第一个数与上一次循环的第一个数相同,则第一个数需要增大,否则会造成结果重复(注意,此处不可直接寻找相同数中的最后一个,因为会漏掉三个数中有其他数与第一个数值相等的情况)
接下来分为以下几种情况:

当L<R时,

  1. 三数相加小于0,L增大
  2. 三数相加大于0,R减小
  3. 三数相加等于0,append入数组,L增大,R减小
    此时,当nums[L]与nums[L-1]相等,L继续增大(不能重复),R同理,减小
class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        re = []
        if not nums:
            return re
        if len(nums)<3:
            return re
        i = 0
        nums.sort()
        while nums[i]<=0 and i < len(nums)-1:
            if i>0 and nums[i-1] == nums[i]:
                i += 1
                continue
            l = i + 1
            r = len(nums) - 1
            while l<r:
                sum = nums[i] + nums[l] + nums[r]
                if sum == 0:
                    re.append([nums[i],nums[l],nums[r]])
                    l += 1
                    r -= 1
                    while nums[l] == nums[l-1] and l<r:
                        l += 1
                    while nums[r] == nums[r+1] and r>l:
                        r -= 1
                elif sum < 0:
                    l = l + 1
                elif sum > 0:
                    r = r - 1
            i += 1
        return re
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值