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.
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]
]
一刷没ac
解题思路:类似3sum的思路,从头遍历,确定一个值然后在后面的元素中找三个数的和为target-pivot,复杂度为O(n^3)
public class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
List<List<Integer>> rst = new ArrayList<List<Integer>>();
if(nums == null || nums.length < 4) return rst;
Arrays.sort(nums);
for(int i = 0; i < nums.length; i++){
if(i == 0 || nums[i] != nums[i-1]){
int pivot = nums[i];
if(pivot * 4 > target) return rst;
if(pivot * 4 == target){
if(i+3 <= nums.length-1 && pivot == nums[i+3]){
List<Integer> res = new ArrayList<Integer>();
for(int j = i; j < i+4; j++){
res.add(nums[j]);
}
rst.add(res);
return rst;
}
}
if(i+3 > nums.length-1) return rst;
threesum(nums, target-pivot, i+1, nums.length-1, rst, pivot);
}
}
return rst;
}
public void threesum(int[] nums, int target, int start, int end, List<List<Integer>> rst, int pivot){
for(int i = start; i <= end-2; i++){
if(i == start || nums[i] != nums[i-1]){
int left = i+1;
int right = end;
while(left < right){
int sum = nums[i]+nums[left]+nums[right];
if(sum == target){
List<Integer> res = new ArrayList<Integer>();
res.add(pivot);
res.add(nums[i]);
res.add(nums[left]);
res.add(nums[right]);
rst.add(res);
left++;
right--;
while(left < right && nums[left] == nums[left-1]) left++;
while(left < right && nums[right] == nums[right+1]) right--;
}
else if(sum < target) left++;
else if(sum > target) right--;
}
}
}
}
}