数据结构之三数之和

(leetcode刷题)

三数之和

  题目: 给定一个包含n个整数的数组nums,判断nums中是否存在三个元素a,b,c,使得a+b+c=0。找出所有满足条件且不重复的三元组。答案中不可以包含重复的三元组。
  示例: 给定数组nums=[-1, 0, 1, 2, -1, -4],返回的之为[[-1, 0, 1],[-1, -1, 2]]

方法:双指针+排序

  • 最直接的想法就是先排序,再两层循环,结果时间太久。看了题解是排序跟双指针的解法。(敬仰下大神)。他的中心思想是确定一个数,另外两个数分别在这个数的右侧和数组最右侧寻找(排序后),大于0就将数组最右侧的指针向左移动,小于0就将这个数旁边的指针向右移动,直至寻找到或进入下一个循环。
    在这里插入图片描述
def threeSum(nums):
    lens = len(nums)
    zeroList = []
    if lens < 3:
        return zeroList
    nums.sort()
    for i in range(lens):
        if nums[i] > 0:
            return zeroList
        if nums[i] == nums[i - 1] and i>0:
            continue
        L = i + 1
        R = lens - 1
        while L < R:
            if nums[L] + nums[R] + nums[i] == 0:
                zeroList.append([nums[L], nums[R], nums[i]])
                while L < R and nums[L] == nums[L + 1]:
                    L = L + 1
                while L < R and nums[R] == nums[R - 1]:
                    R = R - 1
                L = L + 1
                R = R - 1
            elif nums[i] + nums[L] + nums[R] > 0:
                R = R - 1
            else:
                L = L + 1
    return zeroList

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值