题意:

image.png

解题思路:

  1. 思路:
  2. 1. (三重枚举,无重复构造) O(n3)
  3. 2. 3Sum 算法的思路,排序后再增加一重循环即可。

PHP代码实现:

  1. class Solution {
  2. function fourSum($nums, $target) {
  3. if (!$nums) return [];
  4. sort($nums);
  5. $ret = [];
  6. for ($i = 0; $i < count($nums) - 3; $i++) {
  7. if ($i > 0 && $nums[$i] == $nums[$i - 1]) continue;
  8. for ($j = $i + 1; $j < count($nums) - 2; $j++) {
  9. if ($j > $i + 1 && $nums[$j] == $nums[$j - 1]) continue;
  10. $left = $j + 1;
  11. $right = count($nums) - 1;
  12. while ($left < $right) {
  13. $sum = $nums[$i] + $nums[$j] + $nums[$left] + $nums[$right];
  14. if ($sum == $target) {
  15. array_push($ret, [$nums[$i], $nums[$j], $nums[$left], $nums[$right]]);
  16. while ($left < $right && $nums[$left] == $nums[$left + 1]) $left++;
  17. while ($left < $right && $nums[$right] == $nums[$right - 1]) $right--;
  18. $left++; $right--;
  19. } else if ($sum > $target) {
  20. $right--;
  21. } else $left++;
  22. }
  23. }
  24. }
  25. return $ret;
  26. }
  27. }

GO代码实现:

  1. func fourSum(nums []int, target int) [][]int {
  2. ans := make([][]int, 0)
  3. if len(nums) < 4 {
  4. return ans
  5. }
  6. sort.Ints(nums)
  7. for i := 0; i <= len(nums) - 4; i++ {
  8. if i > 0 && nums[i] == nums[i - 1] {
  9. continue
  10. }
  11. for j := i + 1; j <= len(nums) - 3; j++ {
  12. if j > i + 1 && nums[j] == nums[j - 1] {
  13. continue
  14. }
  15. k := j + 1
  16. l := len(nums) - 1
  17. for k < l {
  18. if nums[i] + nums[j] + nums[k] + nums[l] < target {
  19. k++
  20. } else if nums[i] + nums[j] + nums[k] + nums[l] > target {
  21. l--
  22. } else {
  23. ans = append(ans, []int{nums[i], nums[j], nums[k], nums[l]})
  24. for k < l && nums[k+1] == nums[k] {
  25. k++
  26. }
  27. for k < l && nums[l-1] == nums[l] {
  28. l--
  29. }
  30. k++
  31. l--
  32. }
  33. }
  34. }
  35. }
  36. return ans
  37. }