问题:
Given an integer array nums, return all the triplets [nums[i], nums[j], nums[k]]
such that i != j
, i != k
, and j != k
, and nums[i] + nums[j] + nums[k] == 0
.
Notice that the solution set must not contain duplicate triplets.
Example 1:
Input:
nums = [-1,0,1,2,-1,-4]
Output:
[[-1,-1,2],[-1,0,1]]
Example 2:
Input:
nums = []
Output:
[]
Example 3:
Input:
nums = [0]
Output:
[]
Constraints:
0 <= nums.length <= 3000
-10
5<= nums[i] <= 10
5
解答:
与Two Sum不同这个题目中存在相同的数据, 处理思路是先考虑数据不重复, 将list升序排序后,遍历每个元素的同时判断其存在两个值使其满足三数之和为0, 两个值分别取大于当前值的最小值和最大值由于数组是排序的,如果三数之和大于0,那么减小最大值索引, 如果三数之和小于0,增加最小值索引。
- 对于下一个数据和当前数据相同, 跳过
if nums[i] == nums[i-1] and i > 0: continue
- 2 如果三数之和为0 , 那么要过滤掉相邻相同的数据
while left < right and nums[left] == nums[left +1]: left += 1 while left < right and nums[right] == nums[right-1]: right -=1
class Solution: def threeSum(self, nums: List[int]) -> List[List[int]]: if len(nums) <= 1: return [] nums.sort() tripleset = [] pre = 0 for i in range(len(nums)): if nums[i] == nums[i-1] and i > 0: continue left = i + 1 right = len(nums) - 1 while left < right: sum = nums[i] + nums[left] + nums[right] if sum == 0 : tripleset.append([nums[i] ,nums[left], nums[right]]) while left < right and nums[left] == nums[left +1]: left += 1 while left < right and nums[right] == nums[right-1]: right -=1 left += 1 right -= 1 elif sum < 0: left += 1 elif sum > 0: right -= 1 return tripleset
参考及引用
https://leetcode.com/problems/3sum/discuss/7392/Python-easy-to-understand-solution-(O(n*n)-time).
Photo by Lucas Pezeta from Pexels
Comments are closed.