一、题目
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
二、解题
现将nums排序,然后遍历排序后的arr,将赋值当前元素为first,旁边的元素为second(位置为left),最后一个元素为third(位置为right),然后移动left或right(需保证left<right).
- 如果(sum=first+second+third)sum>0,则right向左移动,right -= 1;
2.如果sum<0,则left向右移动,left += 1;
3.如果sum=0,则将[first, second, third]添加到result中,同时如果第left元素和第left+1的元素相等,则跳过这个元素,如果第right元素和第right-1的元素相等,也跳过这个元素,避免出现重复的三元组.
三、代码实现
class Solution {
func threeSum(_ nums: [Int]) -> [[Int]] {
var ret = [[Int]]()
if nums.count<=2 {
return ret
}
var arr = nums.sorted()
for i in 0..<arr.count-2 {
let first = arr[i]
if first>0 {
break
}
if i > 0 && arr[i] == arr[i-1] {
continue
}
var left = i+1
var right = arr.count-1
while left<right {
let second = arr[left]
let third = arr[right]
if first+second+third == 0 {
ret.append([first, second, third])
while left < right && arr[left] == arr[left+1] {
left += 1
}
while left < right && arr[right] == arr[right-1] {
right -= 1
}
left += 1
right -= 1
} else if first+second+third < 0 {
left += 1
} else {
right -= 1
}
}
}
return ret
}
}
Demo地址:github