05Leetcode---threeSum

325 阅读1分钟
题意:从一个数组中找到三个数,使这三个数的和为0。有可能存在多组解,也有可能存在重复的解,所以需要去重。比如:num=[-1,0,1,2,-1,-4];那么存在两组解:[[-1,0,1],[-1,-1,2]],解中的数需要是从小到大排序状态。
步骤:1. 先将数组排序。
   2. 按照TwoSum的思路来解题。怎么解呢?将num的相反数即-num作为target,然后从i+1len(num)-1的数组元素中寻找两个数使它们的和为-num下标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>num[i-1]:



  • left =i+1, right = len(num)-1, target=0-num



  • while left<right:



  • if num[left] + num[right]==target:



  • res.append([num,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:
---------------------作者:千里江河 来源:CSDN 原文:blog.csdn.net/qinghange/ … 版权声明:本文为博主原创文章,转载请附上博文链接!

更多免费技术资料可关注:annalin1203