题目:
Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target.
For example, given array S = [1, 0, -1, 0, -2, 2], and target = 0.
A solution set is:
[
[-1, 0, 0, 1],
[-2, -1, 1, 2],
[-2, 0, 0, 2]
]
大意:
给定一个整数数组,找出a + b + c + d = target的唯一解。
思路:
先确定a和d的两个数,对于a和d两个数,不能同时重复使用。然后再确定b和c,同样这两个数也不能同时重复使用。找出所有满足条件的解,同时可以保证解不重复。
代码:
public class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
List<List<Integer>> result = new LinkedList<>();
Arrays.sort(nums);
if(nums == null || nums.length < 4) {
return result;
}
//第一个数
for(int i = 0; i < nums.length - 3; i++) {
//保证第一个数不重复
if(i > 0 && nums[i] == nums[i - 1]) {
continue;
}
//第四个数
for(int j = nums.length - 1; j > i + 2; j--) {
//保证第四个数不重复
if(j < nums.length - 1 && nums[j] == nums[j + 1]) {
continue;
}
int start = i + 1;//第二个数
int end = j - 1;//第三个数
int n = target - nums[i] - nums[j];
while(start < end) {
if(nums[start] + nums[end] == n) {
List<Integer> cur = new ArrayList<>();
cur.add(nums[i]);
cur.add(nums[start]);
cur.add(nums[end]);
cur.add(nums[j]);
result.add(cur);
//保证再次使用的第二个数不重复
do {
start++;
} while(start < end && nums[start] == nums[start - 1]);
//保证再次使用的第三个数不重复
do {
end--;
} while(start < end && nums[end] == nums[end + 1]);
} else if(nums[start] + nums[end] < n) {
//保证再次使用的第二个数不重复
do {
start++;
} while(start < end && nums[start] == nums[start - 1]);
} else {
//保证再次使用的第三个数不重复
do {
end--;
} while(start < end && nums[end] == nums[end + 1]);
}
}
}
}
return result;
}
}
转自:DERRANTCM博客