题目
题目:输入一个数组,如何找出数组中所有和为0的3个数字的三元组?需要注意的是,返回值中不得包含重复的三元组。例如,在数组[-1,0,1,2,-1,-4]中有两个三元组的和为0,它们分别是[-1,0,1]和[-1,-1,2]。
解题思路
- 异常情况:数组的长度小于 3,直接返回。
- 先对数组进行排序
- 外部循环遍历 numbers ,内部循环获取与 numbers[i] 值和为 0 的 j,和k的值, 初始值:j = i + 1, k = numbers.count -1。
- 外部循环的条件:
i < numbers.count - 2;内部循环的遍历条件:j < k。 - 外部循环要跳过与 i 值相同的索引,循环条件:
while i < sortednums.count && same == sortednums[i];内部循环要跳过与 j 值相同的索引,循环条件:while same == sortednums[j] && j < k。
代码实现
class SumIsZero {
static func threeSum(_ nums: [Int]) -> [[Int]] {
if nums.count < 3 {
return []
}
let sortednums = nums.sorted()
var result: [[Int]] = []
var i = 0
while i < nums.count - 2 {
var j = i + 1
var k = nums.count - 1
while j < k {
let sum = sortednums[i] + sortednums[j] + sortednums[k]
if sum == 0 {
result.append([sortednums[i], sortednums[j], sortednums[k]])
let same = sortednums[j]
while same == sortednums[j] && j < k {
j += 1
}
} else if sum < 0 {
j += 1
} else {
k -= 1
}
}
let same = sortednums[i]
while i < sortednums.count && same == sortednums[i] {
i += 1
}
}
return result
}
}