算法原链接

https://leetcode-cn.com/problems/4sum/

解题思路

四数之和的解题思路可以类比三数之和,依靠双指针解法进行求解,但是双指针的解法的前提是需要先锁定另外两个数值,所以对数组先排序。

接下来按步骤走:

  1. 从左到右(即从小到大)进行遍历锁定第一个最小数值a,这是第一层循环,a循环时需要去重,避免取到重复的结果
  2. 在第一层循环里再嵌套一层循环,从a+1开始遍历数组,锁定第二个数值b,此时 a<b,b循环时需要去重,避免取到重复结果
  3. 在第二层循环里设置cd两个指针,c=b+1,d=numslength - 1,类似三数之和,a < b < c < d
  4. 对nums的abcd指针值进行相加赋值给sum变量,如果sum>0则d左移,如果sum<0则c右移
  5. 如果sum == target,则记录一个结果值,并且需要对cd指针进行移动对c,d指向的值进行去重,避免取到重复结果(注:判断时c<d一定要写在前面) ```go 例如:

必须是这个判断条件 c < d && nums[c+1] == nums[c]

如果是: nums[c+1] == nums[c] && c < d

则会报错,因为c+1可能产生数组越界,会暴毙滴,我试过了

  1. <a name="X9Fpg"></a>
  2. ### 解题代码
  3. ```go
  4. func fourSum(nums []int, target int) [][]int {
  5. length := len(nums)
  6. var result [][]int
  7. if length < 4 {
  8. return result
  9. }
  10. sort.Ints(nums)
  11. for a := 0; a < length-3; a++ {
  12. if a > 0 && nums[a] == nums[a-1] {
  13. continue
  14. }
  15. for b := a + 1; b < length-2; b++ {
  16. if b > a + 1 && nums[b] == nums[b-1] {
  17. continue
  18. }
  19. c, d := b+1, length-1
  20. for c < d {
  21. sum := nums[a] + nums[b] + nums[c] + nums[d]
  22. if sum > target {
  23. d--
  24. continue
  25. } else if sum < target {
  26. c++
  27. continue
  28. }
  29. result = append(result, []int{nums[a], nums[b], nums[c], nums[d]})
  30. for c < d && nums[c+1] == nums[c] {
  31. c++
  32. }
  33. for c < d && nums[d-1] == nums[d] {
  34. d--
  35. }
  36. c++
  37. d--
  38. }
  39. }
  40. }
  41. return result
  42. }