给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解析
1)本题的难点在于去重,而且在过程中去重,最后去重就会超时;
2)首先将数组排序,从第一个数开始遍历,序号记为i;
3)然后定义两个指针,令左指针 l=i+1,右指针 r=n-1,当 l<r 时,while循环;
4)如果 nums[i] + nums[l] + nums[r] == 0,则记录这个解;
5)判断 nums[l] 和 nums[l+1],nums[r] 和 nums[r-1],如果相等,则移动指针,排除重复解;
6)若和大于 0,说明 nums[r] 太大,r 左移;若和小于 0,说明 nums[l] 太小,l 右移;
代码示例
class Solution: def threeSum(self, nums: List[int]) -> List[List[int]]: nums.sort() lst = [] n = len(nums) for i in range(n): if i > 0 and nums[i] == nums[i-1]: continue l = i+1 r = n-1 while l<r: s = nums[i] + nums[l] + nums[r] if s == 0: lst.append([nums[i], nums[l], nums[r]]) while l < r and nums[l] == nums[l+1]: l += 1 while l < r and nums[r] == nums[r-1]: r -= 1 l += 1 r -= 1 elif s < 0: l += 1 else: r -= 1 return lst
执行用时:628 ms, 在所有 Python3 提交中击败了 75.65% 的用户.
本文为 陈华 原创,欢迎转载,但请注明出处:http://edu.ichenhua.cn/read/418