image.png
跟三数之和差不多,不过

双指针法

  1. class Solution {
  2. public List<List<Integer>> fourSum(int[] nums, int target) {
  3. List<List<Integer>> list = new ArrayList<>();
  4. if(nums.length < 4) return list;
  5. Arrays.sort(nums);
  6. for(int i = 0; i < nums.length - 3; i++){
  7. if(i > 0 && nums[i] == nums[i-1]) continue;
  8. for(int j = i + 1; j < nums.length - 2; j++){
  9. // j > i + 1,别写成j > 1
  10. if(j > i + 1 && nums[j] == nums[j-1]) continue;
  11. int left = j+1;
  12. int right = nums.length - 1;
  13. int remain = target - nums[i] - nums[j];
  14. while(left < right){
  15. int temp = nums[left] + nums[right];
  16. if(temp == remain){
  17. list.add(Arrays.asList(nums[i], nums[j], nums[left] , nums[right]));
  18. right--;
  19. left++;
  20. while(left < right && nums[right] == nums[right+1]) right--;
  21. while(left < right && nums[left] == nums[left - 1]) left++;
  22. }
  23. else if(temp > remain) right--;
  24. else left++;
  25. }
  26. }
  27. }
  28. return list;
  29. }
  30. }

image.png

多加两行

  1. class Solution {
  2. public List<List<Integer>> fourSum(int[] nums, int target) {
  3. List<List<Integer>> list = new ArrayList<>();
  4. if(nums.length < 4) return list;
  5. Arrays.sort(nums);
  6. for(int i = 0; i < nums.length - 3; i++){
  7. if(i > 0 && nums[i] == nums[i-1]) continue;
  8. for(int j = i + 1; j < nums.length - 2; j++){
  9. // j > i + 1,别写成j > 1
  10. if(j > i + 1 && nums[j] == nums[j-1]) continue;
  11. int left = j+1;
  12. int right = nums.length - 1;
  13. int remain = target - nums[i] - nums[j];
  14. //以下两行大大减少没必要的遍历
  15. if(nums[left] + nums[left+1] > remain) break;
  16. if(nums[right] + nums[right-1] < remain) continue;//这里不是break
  17. while(left < right){
  18. int temp = nums[left] + nums[right];
  19. if(temp == remain){
  20. list.add(Arrays.asList(nums[i], nums[j], nums[left] , nums[right]));
  21. right--;
  22. left++;
  23. while(left < right && nums[right] == nums[right+1]) right--;
  24. while(left < right && nums[left] == nums[left - 1]) left++;
  25. }
  26. else if(temp > remain) right--;
  27. else left++;
  28. }
  29. }
  30. }
  31. return list;
  32. }
  33. }

image.png