解法一:排序+双指针

思路和15. 三数之和一样,再多嵌套一层循环。

  1. import java.util.*;
  2. class Solution {
  3. public List<List<Integer>> fourSum(int[] nums, int target) {
  4. final int n = nums.length;
  5. List<List<Integer>> ans = new LinkedList<>();
  6. Arrays.sort(nums);
  7. for (int first = 0; first < n - 3; ) {
  8. for (int second = first + 1; second < n - 2; ) {
  9. int fourth = n - 1;
  10. for (int third = second + 1; (third < n - 1) && (third < fourth); ) {
  11. int sum = nums[first] + nums[second] + nums[third] + nums[fourth];
  12. while ((sum > target) && (third < fourth)) {
  13. sum -= nums[fourth];
  14. --fourth;
  15. sum += nums[fourth];
  16. }
  17. if (third >= fourth) {
  18. break;
  19. }
  20. if (sum == target) {
  21. List<Integer> list = new ArrayList<>();
  22. list.add(nums[first]);
  23. list.add(nums[second]);
  24. list.add(nums[third]);
  25. list.add(nums[fourth]);
  26. ans.add(list);
  27. }
  28. ++third;
  29. while ((nums[third] == nums[third - 1]) && (third < fourth)) {
  30. ++third;
  31. }
  32. }
  33. ++second;
  34. while ((nums[second] == nums[second - 1]) && (second < n - 2)) {
  35. ++second;
  36. }
  37. }
  38. ++first;
  39. while ((nums[first] == nums[first - 1]) && (first < n - 3)) {
  40. ++first;
  41. }
  42. }
  43. return ans;
  44. }
  45. }