解析
首先对数组从小到大排序,然后枚举每一个数。
对每一个数声明一个指针,一个是指向距离当前数最近的指针j,一个是指向最大数的指针k,然后进行求和sum:
1. sum < 0 : 说明当前sum太小了,需要把j++
,让sum变大
2. sum > 0 : 说明当前sum太大了,需要把k--
,让sum变小
3. sum = 0 : 说明找到结果了,因为题目要求结果中不允许有重复的情况,所以需要对i、j、k进行去重。因为找到一种结果了,j和k都需要往里走,才能找到其他结果,所以j++
, k--
代码
func threeSum(nums []int) [][]int {
res := make([][]int, 0)
sort.Ints(nums)
if nums[0] > 0 {
return res
}
for i := 0; i < len(nums); i++ {
if i > 0 && nums[i] == nums[i-1] {
continue
}
var (
j = i + 1
k = len(nums) - 1
)
for j < k {
sum := nums[i] + nums[j] + nums[k]
if sum > 0 {
k--
} else if sum < 0 {
j++
} else {
res = append(res, []int{nums[i], nums[j], nums[k]})
for j < k && nums[k] == nums[k-1] {
k--
}
for j < k && nums[j] == nums[j+1] {
j++
}
k--
j++
}
}
}
return res
}