力扣链接:https://leetcode-cn.com/probl...
解题思路:
- 之前尝试过很多刷题的方法,一方面感觉是自己的技术积累和对语言的了解运用确实还差火候,另一方面是刷题的思路不对,按照题目顺序来刷或者单纯按照难度来刷都有其缺陷,首先按照题目顺序来刷,实际上每个题目的知识点都不相同,东一榔头,西一棒槌,很难系统性的学习某个知识点,按照难度来耍,一开始就上mid或者hard的题目,很快就会因为畏难而造成刷题效率大打折扣。这次采用了新的方法,首先分门别类,如数组/链表/树/动态规划等,然后每个类别先从简单刷题,每个类别每个难度刷20道题。经过一段时间的验证以后,有事半功倍的效果
- 回到这道题本身,三数之和/最接近的三数之和/四数之和,本质上都是采用一种方法,那就是排序+双指针,最后两位数一定是双指针,那么前面剩余的数字就是需要循环遍历的
- 这道题为了优化一个不需要的便利,对边界做了一些优化,当然这些都是小优化,不改变本质的算法
func fourSum(nums []int, target int) [][]int {
n := len(nums)
sort.Ints(nums)
ans := make([][]int, 0)
for i := 0; i < n-3 && nums[i]+nums[i+1]+nums[i+2]+nums[i+3] <= target; i++ {
if i > 0 && nums[i] == nums[i-1] || nums[i]+nums[n-1]+nums[n-2]+nums[n-3] < target {
continue
}
for j := i + 1; j < n-2 && nums[i]+nums[j]+nums[j+1]+nums[j+2] <= target; j++ {
if j > i+1 && nums[j] == nums[j-1] || nums[i]+nums[j]+nums[n-1]+nums[n-2] < target {
continue
}
k, l := j+1, n-1
for k < l {
sum := nums[i] + nums[j] + nums[k] + nums[l]
if sum == target {
ans = append(ans, []int{nums[i], nums[j], nums[k], nums[l]})
for k++; k < l && nums[k] == nums[k-1]; k++ {
}
for l--; k < l && nums[l] == nums[l+1]; l-- {
}
} else if sum > target {
l--
} else {
k++
}
}
}
}
return ans
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。