首页 > 代码库 > [leetcode]3Sum @ Python
[leetcode]3Sum @ Python
原题地址:http://oj.leetcode.com/problems/3sum/
题意:从一个数组中找到三个数,使这三个数的和为0。有可能存在多组解,也有可能存在重复的解,所以需要去重。比如:num=[-1,0,1,2,-1,-4];那么存在两组解:[[-1,0,1],[-1,-1,2]],解中的数需要是从小到大排序状态。
解题思路:1,先将数组排序。
2,排序后,可以按照TwoSum的思路来解题。怎么解呢?可以将num[i]的相反数即-num[i]作为target,然后从i+1到len(num)-1的数组元素中寻找两个数使它们的和为-num[i]就可以了。下标i的范围是从0到len(num)-3。
3,这个过程要注意去重。
4,时间复杂度为O(N^2)。
代码:
class Solution: # @return a list of lists of length 3, [[val1,val2,val3]] 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 while left < right: if num[left] + num[right] == -num[i]: 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] < -num[i]: while left < right: left += 1 if num[left] > num[left-1]: break else: while left < right: right -= 1 if num[right] < num[right+1]: break return res
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。