题目
思路
题目要求答案中不包含重复的三元组,即要对结果进行去重。
首先对数组进行排序,方便去重。正因为是有序的,我们采用“定一移二”的思想,即双指针法。
代码
func threeSum(nums []int) [][]int {
// 排序
sort.Ints(nums)
// 结果储存
var result [][]int
// 注意下标控制
for i := 0; i < len(nums) - 2;i ++ {
n1 := nums[i]
// 因为是已经排序的,如果n1大于0 说明不可能有满足条件的组合 直接跳出
if n1 > 0 {
break
}
// 如果n1已经使用过了,那么后面与n1大小相同的直接跳过,以防出现重复答案
if i > 0 && n1 == nums[i - 1] {
continue
}
// left, right指针
left, right := i + 1, len(nums) - 1
for left < right {
n2, n3 := nums[left], nums[right]
if n1 + n2 + n3 == 0 {
// 满足条件 存储结果
result = append(result, []int{
n1, n2, n3})
// left后面如果有和left相同的数就会导致重复,这里我们做个判断,去重
for left < right && nums[left] == n2 {
left ++
}
for left < right && nums[right] == n3 {
right --
}
} else if n1 + n2 + n3 < 0 {
// 指针右移
left ++
} else {
// 指针左移
right --
}
}
}
return result
}
拓展
三数之和这道题使用排序+双指针,LC第一道题两数之和官方题解中给的双层遍历和哈希法,如果要使用双指针法来解决两数之和,题目就必须得有数组有序这个条件,有序是使用双指针的基础。