题目15:三数之和
题目描述:
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请
你返回所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组
题解:
本题的主要难点是输出不重复的数组,如果可以重复直接三重循环输出就好,不重复就要考虑使用双指针。一重循环固定一个数,并求出其相反数,在数组中找两个数相加等于这个相反数。
func threeSum(nums []int) [][]int {
sort.Ints(nums)
//排序后:数组长度小于3或者最小值大于0则结果为空
if len(nums)<3 || nums[0]>0{
return [][]int{}
}
res := [][]int{}
for a:=0;a<len(nums)-2;a++{
if a>0&&nums[a]==nums[a-1]{
continue
}
//将三数之和为0分为两部分,一个数和它的相反数,然后再除去这个数的数组里求两数之和为它的相反数的数
addition := -1*nums[a]
left := a+1
right := len(nums)-1
for left<right{
if nums[left]+nums[right]==addition{
res = append(res,[]int{nums[a],nums[left],nums[right]})
left++
right--
for nums[left]==nums[left-1]&&left<len(nums)-1{
left++
}
for nums[right]==nums[right+1]&&right>1{
right--
}
}else if nums[left]+nums[right]>addition{ //两数相加大于家数,则右指针往左移
right--
}else{
left++
}
}
}
return res
}