排序 + 双指针 + 这也是解决3sum的标准的做法。
func threeSum(nums []int) [][]int {
if nums == nil {
return [][]int{}
}
sort.Ints(nums) // 排序
result := [][]int{}
for k,v := range nums {
if k == len(nums)-2 {
break
}
if k >0 && nums[k] == nums[k-1] {
continue
}
l,r := k+1,len(nums)-1 // 在剩余的子数组中,使用两个指针来分别代表最左端和最右端
for l< r {
value := nums[l]+nums[r]+v
if value >0 {
r--
}else if value <0 {
l++
}else {
value := []int{nums[l],nums[r],v}
result =append(result,value)
for l < r &&nums[l] == nums[l+1]{
l++
}
for l < r && nums[r] == nums[r-1]{
r--
}
l++
r--
}
}
}
return result
}
可以使用一个hash 不过我没有找到很好的关于去重的做法