力扣链接:https://leetcode-cn.com/probl...
解题思路:
- 这道题跟之前的两数之和有点像,但是解法哈难度都完全不一样了,mid的题目相应来说还是需要刻意训练来掌握的,类似三数之和这样的题目,如果不懂解法,可能无论怎样努力也无法得到期望的解
- 学习自己么有思路的题目时,可以先从模仿开始,就像书法大师,绘画大师,无一不是从临摹拓字开始的,学习,强化,记忆,然后融汇贯通
- 继续分析题干,这道题其实最难的点在于三元组不能重复,那么我们可以将数组排序,这样就不会有重复的三元组,接下来我们首先确定a,即最外面的一轮循环,然后b和c可以使用双指针来进行优化,最后要注意边界条件:a/b/c都不能重复,遇到相同的值直接跳过,b <= c等等
- 关键思路:排序+双指针优化
func threeSumm(nums []int) [][]int {
n := len(nums)
sort.Ints(nums)
ans := make([][]int, 0)
// 枚举a
for first := 0; first < n; first++ {
// 跟上次的数字相同则跳过
if first > 0 && nums[first] == nums[first-1] {
continue
}
// c对应的指针在数组的最右端
third := n - 1
target := -1 * nums[first]
// 枚举b
for second := first + 1; second < n; second++ {
// 跟上次的数字相同则跳过
if second > first+1 && nums[second] == nums[second-1] {
continue
}
// 需要保证b在c的右侧,同时两个数的和大于target的相反数
if second < third && nums[second]+nums[third] > target {
third--
}
// 如果b等于c的时候还没有想等的数组,那么随着b的增大,则更不会有了
if second == third {
break
}
if nums[second]+nums[third] == target {
ans = append(ans, []int{nums[first], nums[second], nums[third]})
}
}
}
return ans
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。