原題地址: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