四数之和,类似三数之和
排序后,双层循环+ 双指针 ,中间进行一些剪枝操作。
时间复杂度O(n^3).
public List<List<Integer>> fourSum(int[] nums, int target) { List<List<Integer>> results = new ArrayList<List<Integer>>(); //异常处理 if (nums == null || nums.length < 4){ return results; } //排序 Arrays.sort(nums); int length = nums.length; //a for (int i = 0; i < length-3; i++) { if (i > 0 && nums[i] == nums[i-1]) { continue; } //a+其余3个的最小值 > target,当前a无解,后面的更大,所以跳过后面所有的。 if (nums[i] + nums[i+1] + nums[i+2] + nums[i+3] >target){ break; } //a+其余3个的最大值 < target,当前a无解,后面a变大时可能有解 if (nums[i] + nums[length-3]+ nums[length-2] + nums[length-1] <target){ continue; } //b for (int j = i+1; j < length - 2 ; j++) { //和a类似 if (j > i+1 && nums[j] == nums[j-1]) { continue; } if (nums[i]+nums[j] + nums[j+1] + nums[j+2] > target) { break; } if (nums[i] + nums[j] + nums[length-2] + nums[length-1] < target) { continue; } //双指针c,d int left = j+1 , right = length - 1; while (left < right) { int sum = nums[i] + nums[j] + nums[left] + nums[right]; if (sum == target) { results.add(Arrays.asList(nums[i],nums[j], nums[left], nums[right])); while (left < right && nums[left] == nums[left+1]) { left++; } left++; while (left <right && nums[right] == nums[right-1]) { right--; } right--; } else if (sum < target) { left++; }else { right--; } }//end c,d }// end b }// end a return results; }