剑指 Offer II 007. 数组中和为 0 的三个数
2022-04-08 本文已影响0人
邦_
排序后,固定一个数 ,就变成了查找两数之和等于固定的数的反数
注意找到之后 要把左指针往右移动 右指针往左移动 要不会陷入死循环
但是会发现有重复的。。 如果相等的时候 双指针移动之后的元素是一样的
对于左指针的话 就是当前的和往后挪动一位的相等
对于右指针的话 就是当前的和往前挪动一位的相等
但是。。 还是会有重复的。。 因为前一个和后一个数字一样 有可能找出来的结果也是一样
所以 当前一个和后一个数字值相同的时候 跳过
注意这块是 -1 和前边的比, 不能和后边的比 这样会造成没有统计和计算的被直接跳过
while left < right && tempNums[left] == tempNums[left - 1]{
left += 1
}
while left < right && tempNums[right] == tempNums[right + 1]{
right -= 1
}
func threeSum(_ nums: [Int]) -> [[Int]] {
if nums.isEmpty || nums.count < 3{
return []
}
let tempNums = nums.sorted()
var array :[[Int]] = Array()
for i in 0..<tempNums.count - 1 {
if i > 0 && tempNums[i] == tempNums[i - 1] {
continue
}
var left = i + 1
var right = tempNums.count - 1
while left < right {
if tempNums[left] + tempNums[right] == -tempNums[i] {
array.append([tempNums[i],tempNums[left],tempNums[right]])
left += 1
right -= 1
while left < right && tempNums[left] == tempNums[left - 1]{
left += 1
}
while left < right && tempNums[right] == tempNums[right + 1]{
right -= 1
}
}
else if tempNums[left] + tempNums[right] > -tempNums[i] {
right -= 1
}
else {
left += 1
}
}
}
return array
}