15. 3Sum (python)

Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0?
Find all unique triplets in the array which gives the sum of zero.
Note: The solution set must not contain duplicate triplets.
For example, given array S = [-1, 0, 1, 2, -1, -4],
A solution set is:
[
[-1, 0, 1],
[-1, -1, 2]
]
题意:在数组S中找到三个元素相加和为0,当然要去重
思路:采用快速排序法只排一次,每次取一个数x,问题转化为target-x的2sum问题
时间复杂度为O(n^2)
注意去重在三个地方:
第一个:每次取一个数,只将该元素后续的列表中查找target-x的2sum和;
第二个:每次取一个数,需要判断是否和前一个数重复(循环起始数除外),只有不重复才进行2sum计算,重复则continue
第三个:在进行2sum计算,若2sum的和等于target后,需要将左右指针移位,过滤后续重复元素,直到元素不重复再计算2sum之和
Runtime: 202 ms

class Solution(object):
    '''
    快速排序,递归的思想
    '''
    def  qksort(self,nums):
        if  len(nums)<=1:
            return nums
        base=nums[0]
        left=[]
        right=[]
        for i in nums[1:]:
            if i<base:
                left.append(i)
            else:
                right.append(i)
        left=self.qksort(left)
        right=self.qksort(right)
        return  left+[base]+right
    def threeSum(self, nums):
        if len(nums)<3:
            return  []
        nums=self.qksort(nums)
        #nums=sorted(nums)
        triple=[]
        for i in range(0,len(nums)-2):
            if nums[i]!=nums[i-1] or i==0:#去重
                target=0-nums[i]
                l=i+1
                r=len(nums)-1
                while  l<r:
                    s=nums[l]+nums[r]
                    if s==target:
                        triple.append([nums[i],nums[l],nums[r]]) 
                        l+=1
                        r-=1
                        while l<r and nums[l]==nums[l-1]:
                            l+=1
                        while l<r and nums[r]==nums[r+1]:
                            r-=1
                    elif s<target:
                        l+=1
                    else:
                        r-=1
        return  triple      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值