力扣链接:https://leetcode-cn.com/probl...
解题思路:

  1. 之前尝试过很多刷题的方法,一方面感觉是自己的技术积累和对语言的了解运用确实还差火候,另一方面是刷题的思路不对,按照题目顺序来刷或者单纯按照难度来刷都有其缺陷,首先按照题目顺序来刷,实际上每个题目的知识点都不相同,东一榔头,西一棒槌,很难系统性的学习某个知识点,按照难度来耍,一开始就上mid或者hard的题目,很快就会因为畏难而造成刷题效率大打折扣。这次采用了新的方法,首先分门别类,如数组/链表/树/动态规划等,然后每个类别先从简单刷题,每个类别每个难度刷20道题。经过一段时间的验证以后,有事半功倍的效果
  2. 回到这道题本身,三数之和/最接近的三数之和/四数之和,本质上都是采用一种方法,那就是排序+双指针,最后两位数一定是双指针,那么前面剩余的数字就是需要循环遍历的
  3. 这道题为了优化一个不需要的便利,对边界做了一些优化,当然这些都是小优化,不改变本质的算法
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
}

LabRat
1 声望1 粉丝