共计 916 个字符,预计需要花费 3 分钟才能阅读完成。
力扣链接: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
}
正文完