
跟三数之和差不多,不过
双指针法
class Solution { public List<List<Integer>> fourSum(int[] nums, int target) { List<List<Integer>> list = new ArrayList<>(); if(nums.length < 4) return list; Arrays.sort(nums); for(int i = 0; i < nums.length - 3; i++){ if(i > 0 && nums[i] == nums[i-1]) continue; for(int j = i + 1; j < nums.length - 2; j++){ // j > i + 1,别写成j > 1 if(j > i + 1 && nums[j] == nums[j-1]) continue; int left = j+1; int right = nums.length - 1; int remain = target - nums[i] - nums[j]; while(left < right){ int temp = nums[left] + nums[right]; if(temp == remain){ list.add(Arrays.asList(nums[i], nums[j], nums[left] , nums[right])); right--; left++; while(left < right && nums[right] == nums[right+1]) right--; while(left < right && nums[left] == nums[left - 1]) left++; } else if(temp > remain) right--; else left++; } } } return list; }}

多加两行
class Solution { public List<List<Integer>> fourSum(int[] nums, int target) { List<List<Integer>> list = new ArrayList<>(); if(nums.length < 4) return list; Arrays.sort(nums); for(int i = 0; i < nums.length - 3; i++){ if(i > 0 && nums[i] == nums[i-1]) continue; for(int j = i + 1; j < nums.length - 2; j++){ // j > i + 1,别写成j > 1 if(j > i + 1 && nums[j] == nums[j-1]) continue; int left = j+1; int right = nums.length - 1; int remain = target - nums[i] - nums[j]; //以下两行大大减少没必要的遍历 if(nums[left] + nums[left+1] > remain) break; if(nums[right] + nums[right-1] < remain) continue;//这里不是break while(left < right){ int temp = nums[left] + nums[right]; if(temp == remain){ list.add(Arrays.asList(nums[i], nums[j], nums[left] , nums[right])); right--; left++; while(left < right && nums[right] == nums[right+1]) right--; while(left < right && nums[left] == nums[left - 1]) left++; } else if(temp > remain) right--; else left++; } } } return list; }}
