题目描述
解法思路
- 要求3元组不重复 ,因此考虑先排序,采用
sort.Ints(nums)对slice进行排序。排序之后对于满足要求的三元组{a, b, c},有a <= b <= c,可以考虑从前向后进行三重遍历找到满足要求的所有不重复三元组,时间复杂度为o(N3)o(N^3)o(N3)。
- 为了降低时间复杂度,考虑优化三重遍历。可以发现,对于固定的a,在进行第二轮遍历时对于每个b,有c=−a−bc = -a - bc=−a−b,即只需要从后向前(从大到小)找目标c即可,并且对于固定的a,在进入第二轮遍历之前将c的位置初始化为n - 1,如果存在满足要求的{a, b, c},那么对于b之后的元素b',b' > b,那么如果存在满足要求的{a, b', c'},一定有c' < c,那么只需要继续从上一个c往前找就可以,即二、三轮遍历可以合并为一轮。
代码实现
go
复制代码
func threeSum(nums []int) [][]int {
n := len(nums)
sort.Ints(nums)
res := make([][]int, 0)
for i := 0; i < n; i++ {
if i > 0 && nums[i] == nums[i - 1] {
continue
}
k := n - 1
for j := i + 1; j < n; j++ {
if j > i + 1 && nums[j] == nums[j - 1] {
continue
}
for {
if nums[i] + nums[j] + nums[k] < 0 || k <= j{
break
}
if nums[i] + nums[j] + nums[k] == 0 {
res = append(res, []int{nums[i], nums[j], nums[k]})
break
}
k--
}
}
}
return res
}