描述
给定一个包含 n 个整数的数组nums,判断nums中是否存在三个元素 a,b,c ,使得a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
思路
先对nums排序
1. 先固定一个数nums[i], 然后从l = i+1 和r=len -1 的位置分别向后和向前遍历, 中间遍历的时候 将重复的数去掉即可
2. 判断三个数相加是否
=0 时 l=l+1 r=r-1
<0 时则l = l+1
>0 时 r = r-1
3. 如果nums[i] > 0 时则肯定不可能=0
实现
type TypeSlice []int
func (s TypeSlice) Len() int { return len(s) }
func (s TypeSlice) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
func (s TypeSlice) Less(i, j int) bool { return s[i] < s[j] }
func threeSum(nums []int) [][]int {
var sortSlice = TypeSlice(nums)
var rets = make([][]int, 0)
var length = len(nums)
sort.Sort(sortSlice)
nums = []int(sortSlice)
for i:=0; i < length; i++{
if nums[i] > 0{
break
}
if i - 1 >= 0 && nums[i - 1] == nums[i] {
continue
}
l := i + 1
r := length - 1
for l < r{
if nums[i] + nums[l] + nums[r] == 0{
println(fmt.Sprintf("1:l=%d, r=%d", l, r))
rets = append(rets, []int{nums[i], nums[l], nums[r]})
for l < r{
if nums[l] == nums[l + 1]{
l += 1
}else{
break
}
}
for l < r{
if nums[r] == nums[r - 1]{
r -= 1
}else{
break
}
}
l += 1
r -= 1
}else if nums[i] + nums[l] + nums[r] > 0{
r -= 1
}else if nums[i] + nums[l] + nums[r] < 0{
l += 1
}
}
}
return rets
}