给定一个包含 n 个整数的数组 nums 和一个目标值 target,
判断 nums 中是否存在四个元素 a,b,c 和 d ,
使得 a + b + c + d 的值与 target 相等?
找出所有满足条件且不重复的四元组。
示例:
给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。
满足要求的四元组集合为:
[
[-1, 0, 0, 1],
[-2, -1, 1, 2],
[-2, 0, 0, 2]
]
解法:
1.两层for循环套一个双指针求和。优化:去重。
public List<List<Integer>> fourSum(int[] nums, int target) { Arrays.sort(nums); List<List<Integer>> list = new ArrayList<>(); for (int i = 0; i < nums.length-3; i++) { // 第一个数去重 if (i==0||(i>0&&(nums[i]!=nums[i-1]))) { for (int j = i + 1; j < nums.length - 2; j++) { // 第二个数去重 if (j==i+1||(j>i+1&&(nums[j]!=nums[j-1]))) { int lo = j + 1; int hi = nums.length - 1; int sum = nums[i] + nums[j] - target; while (lo<hi) { if (nums[lo] + nums[hi] == -sum) { list.add(Arrays.asList(nums[i], nums[j], nums[lo], nums[hi])); // 三四数去重 while (lo<hi&&nums[lo]==nums[lo+1]) lo++; while (lo<hi&&nums[hi]==nums[hi-1]) hi--; lo++; hi--; } else if (nums[lo] + nums[hi] > -sum) { hi--; } else { lo++; } } } } } } return list; }
2.优化去重方法,使用list自带函数去重。但是会增加循环次数。
public List<List<Integer>> fourSum(int[] nums, int target) { Arrays.sort(nums); List<List<Integer>> list = new ArrayList<>(); for (int i = 0; i < nums.length-3; i++) { for (int j = i + 1; j < nums.length - 2; j++) { int lo = j + 1; int hi = nums.length - 1; int sum = nums[i] + nums[j] - target; while (lo<hi) { if (nums[lo] + nums[hi] == -sum) { if (!list.contains(Arrays.asList(nums[i], nums[j], nums[lo], nums[hi]))) { list.add(Arrays.asList(nums[i], nums[j], nums[lo], nums[hi])); } lo++; hi--; } else if (nums[lo] + nums[hi] > -sum) { hi--; } else { lo++; } } } } return list; }