先对数组进行排序
三个数的坐标分别为,i,j,k
为了不重复,假定i<j<k
枚举i,j、k的判断用双指针,j、k分别从i后的头尾出发,向中间靠拢
如果结果=0,就各自往中间移动一位;如果结果>0,说明数字大了,k往前移动一位;如果结果<0,说明数字小了,j往后移动一位
过程中注意不重复,重复的枚举跳过
时间复杂度为O(N2)
1 class Solution(object): 2 def threeSum(self, nums): 3 """ 4 :type nums: List[int] 5 :rtype: List[List[int]] 6 """ 7 nums.sort() 8 res_list = [] 9 n = len(nums) 10 i = 0 11 while i < n - 2: 12 if i > 0 and nums[i] == nums[i-1]: 13 i += 1 14 continue 15 j = i + 1 16 k = n - 1 17 while k > j: 18 if nums[i] + nums[j] + nums[k] == 0: 19 res_list.append([nums[i], nums[j], nums[k]]) 20 j += 1 21 k -= 1 22 while k > j and nums[j] == nums[j-1]: 23 j += 1 24 elif nums[i] + nums[j] + nums[k] > 0: 25 k -= 1 26 else: 27 j += 1 28 i += 1 29 return res_list