1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
|
private List<List<Integer>> fourSum(int[] nums, int target) { List<List<Integer>> result = new ArrayList<>(); if (nums.length < 4) { return result; } Arrays.sort(nums); List<Integer> values = new ArrayList<>(4); for (int i = 0; i < nums.length - 3; i++) { if (i > 0 && nums[i] == nums[i - 1]) { continue; } values.add(nums[i]); List<List<Integer>> sumList = threeSum(nums, target - nums[i], i + 1, nums.length - 1, values); if (sumList.size() > 0) { result.addAll(sumList); } values.remove(values.size() - 1); } return result; }
private List<List<Integer>> threeSum(int[] nums, int target, int start, int end, List<Integer> values) { List<List<Integer>> result = new ArrayList<>(); for (int i = start; i < nums.length - 2; i++) { if (i > start && nums[i] == nums[i - 1]) { continue; } values.add(nums[i]); List<List<Integer>> sumList = twoSum(nums, target - nums[i], i + 1, nums.length - 1, values); if (sumList.size() > 0) { result.addAll(sumList); } values.remove(values.size() - 1); } return result; }
private List<List<Integer>> twoSum(int[] nums, int target, int start, int end, List<Integer> values) { List<List<Integer>> result = new ArrayList<>(); int lp = start, rp = end; int size = values.size() + 2; while (lp < rp) { int temp = nums[lp] + nums[rp]; if (temp == target) { List<Integer> sumList = new ArrayList<>(size); sumList.addAll(values); sumList.add(nums[lp]); sumList.add(nums[rp]); result.add(sumList); while (lp < rp && nums[lp] == nums[++lp]); while (lp < rp && nums[rp] == nums[--rp]); } else if (temp < target) { lp++; } else { rp--; } } return result; }
|