classSolution: defthreeSum(self, nums: List[int]) -> List[List[int]]: nums.sort() ans = [] for i inrange(len(nums)): if i > 0and nums[i] == nums[i-1]: continue l,r = i+1,len(nums)-1 while l < r: if nums[i]+nums[l]+nums[r] == 0: ans.append([nums[i],nums[l],nums[r]]) pre_l,pre_r = l,r while l < r and nums[l] == nums[pre_l]: l+=1 r-=1 elif nums[i]+nums[l]+nums[r] < 0: l+=1 else: r-=1 return ans
defthreeSum(self, nums: List[int]) -> List[List[int]]: d = {} ans = [] for x in nums: d[x] = d.get(x,0)+1 ###此处ab均是去重后的 a = [x for x in d if x > 0] b = [x for x in d if x <= 0] if d.get(0,0) > 2: ans.append([0,0,0]) for i in a: for j in b: target = -(i+j) if target in d: if target == i and d[target] > 1: ans.append([i,i,j]) if target == j and d[target] > 1: ans.append([i,j,j]) ###下一个if条件要注意,如果是在(i,j)区间,得b>0 ###主要是为了去重,如果是在(taget,i)和(j,target)得b>=0 if target > i or target < j: ans.append([i,j,target]) return ans
classSolution: defthreeSum(self, nums: List[int]) -> List[List[int]]: ###大神答案 ###先考虑重复大于1次的 ###再考虑通过bisect二分查找去寻找 ans = [] counts = {} for i in nums: counts[i] = counts.get(i, 0) + 1 nums = sorted(counts) for i, num inenumerate(nums): if counts[num] > 1: if num == 0: if counts[num] > 2: ans.append([0, 0, 0]) else: if -num * 2in counts: ans.append([num, num, -2 * num]) if num < 0: two_sum = -num left = bisect.bisect_left(nums, (two_sum - nums[-1]), i + 1) for i in nums[left: bisect.bisect_right(nums, (two_sum // 2), left)]: j = two_sum - i if j in counts and j != i: ans.append([num, i, j]) return ans
classSolution: defthreeSum(self, nums: List[int]) -> List[List[int]]: #hash表 nums.sort() d = {} for i inrange(len(nums)): if nums[i] notinlist(d.keys()): d[nums[i]] = [i] else: d[nums[i]].append(i) ans = [] for i inrange(len(nums)): if i>=1and nums[i-1]==nums[i]: continue else: flag = 0 for j inrange(i+1,len(nums)): if flag and j>1and nums[j-1]==nums[j]: continue else: x = -1*(nums[i]+nums[j]) try: ###这里不判断tmp是否在d中出现过,要不然时间复杂度更高,用try能够省时间 idx = [_ for _ in d[x] if _ > j] iflen(idx): ans.append([nums[i],nums[j],x]) flag = 1 except: pass return ans