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:
                         left +=1
                         if num[left-1] < num[left]:      # 防止相邻两元素相同
                             break
                    elif num[left] + num[right] < target:
                         right -=1
                         if num[right] < num[right+1]: 
                             break
        return res

reference:

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

猜你喜欢

转载自blog.csdn.net/qinghange/article/details/82193413
今日推荐