一、題目
給定一個包含 n 個整數(shù)的數(shù)組 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?找出所有滿足條件且不重復的三元組。
注意:答案中不可以包含重復的三元組。
例如, 給定數(shù)組 nums = [-1, 0, 1, 2, -1, -4],
滿足要求的三元組集合為:
[
[-1, 0, 1],
[-1, -1, 2]
]
二、解題
現(xiàn)將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的元素相等,也跳過這個元素,避免出現(xiàn)重復的三元組.
三、代碼實現(xiàn)
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