classSolution: defthreeSum(self, nums: List[int]) -> List[List[int]]: # 先将nums排序 nums.sort() res = [] for i in range(len(nums) - 2): # 设置两个指针 l, r = i + 1, len(nums) - 1 if nums[i] > 0 : return res # 去除重复的判断,因为nums[i -1]已经包含了nums[i]的所有组合的可能性 if i > 0and nums[i] == nums[i - 1] : continue while l < r: s = nums[i] + nums[l] + nums[r] if s < 0: # 如果和小于0,证明左边的数太小了,需要往后移 l += 1 # 去除重复的判断,但是前提条件为l<r while l < r and nums[l] == nums[l - 1]: l += 1 elif s > 0: r -= 1 # 如果和大于0,证明右边的数太大了,需要往前移 while l < r and nums[r] == nums[r + 1]: r -= 1 else: res.append([nums[i], nums[l], nums[r]]) l += 1 r -= 1 while l < r and nums[l] == nums[l - 1]: l += 1 while l < r and nums[r] == nums[r + 1]: r -= 1 return res
classSolution: defthreeSum(self, nums: List[int]) -> List[List[int]]: if len(nums) < 3: return [] nums.sort() # 因为a+b = 0等价于a = -b target_hash = {-x: i for i, x in enumerate(nums)} res = [] res_hash = {} # 从零开始检索,到倒数第二位结束 for i, first in enumerate(nums[:-1]): if nums[i] > 0: return res if i > 0and first == nums[i - 1]: continue #从第一个指针的下一位开始搜索 for j, second in enumerate(nums[i + 1:]): # 检查两数之和是否存在于哈希表target_hash中 if first + second in target_hash: target_index = target_hash[first + second] if target_index == i or target_index == i + j + 1: continue # 将找到的结果存入另一个哈希表中, 避免包含重复结果 row = sorted([first, second, nums[target_index]]) key = ",".join([str(x) for x in row]) if key notin res_hash: res.append(row) res_hash[key] = True return res