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.
Note: The solution set must not contain duplicate quadruplets.
解:把4Sum问题转化为3Sum问题。
public class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
List<List<Integer>> result = new ArrayList<>();
Arrays.sort(nums);
int len = nums.length;
if (len<4) return result;
for (int i = 0;i<len-3;i++){
if (i>0){
while (i<len-3 && nums[i] == nums[i-1]) i++;
}
for (int j = i+1;j<len - 2;j++){
if (j>i+1) {
while (j<len-2 && nums[j] == nums[j - 1]) j++;
}
int begin = j+1;
int end = len -1;
while (begin<end){
int temp = nums[i]+nums[j]+nums[begin]+nums[end];
if (temp == target){
List<Integer> list = new ArrayList<>();
list.add(nums[i]);
list.add(nums[j]);
list.add(nums[begin]);
list.add(nums[end]);
result.add(list);
begin++;
end--;
while (begin<end && nums[begin]==nums[begin-1]) begin++;
while (begin<end && nums[end]==nums[end+1]) end--;
}else if (temp < target){
begin++;
while (begin<end && nums[begin]==nums[begin-1]) begin++;
}else {
end--;
while (begin<end && nums[end]==nums[end+1]) end--;
}
}
}
}
return result;
}
}