05Leetcode---threeSum

题意:从一个数组中找到三个数,使这三个数的和为0。有可能存在多组解,也有可能存在重复的解,所以需要去重。比如:num=[-1,0,1,2,-1,-4];那么存在两组解:[[-1,0,1],[-1,-1,2]],解中的数需要是从小到大排序状态。

步骤:1. 先将数组排序。

   2. 按照TwoSum的思路来解题。怎么解呢?将num[i]的相反数即-num[i]作为target,然后从i+1len(num)-1的数组元素中寻找两个数使它们的和为-num[i]。下标i的范围是从0到len(num)-3。

          3. 这个过程要注意去重。    时间复杂度:n(o^2)

排序 + 双指针 + 去重

class Solution:
    def threeSum(self, num):
        num.sort()
        res = []
        for i in range(len(num) - 2):
            if i==0 or num[i]>num[i-1]:
                left =i+1, right = len(num)-1, target=0-num[i]
                while left<right:
                    if num[left] + num[right]==target:
                        res.append([num[i],num[left],num[right]])
                        left +=1; right -=1
                        #去重
                         while left < right and num[left]==num[left-1]: 
                                left +=1
                         while left < right and num[right]==num[right-1]:
                                right -=1

                    elif num[left] + num[right] < target:
                         while left<right:
                              left +=1
                              if num[left-1] < num[left]:      # 去重
                                 break
                    elif num[left] + num[right] > target:
                         while left<right:
                             right -=1
                             if num[right] < num[right+1]:     # 去重
                                    break
        return res

reference:

 python:      http://www.cnblogs.com/zuoyuan/p/3699159.html

c++版:思路及实现   blog.youkuaiyun.com/allenzyoung/article/details/50828375   排序vector(自带排序) + 双指针

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值