题目详情
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.输入一个长度为n的整数数组和一个目标整数target,我们需要找出是否存在4个元素a、b、c、d,使得abcd的和等于target。如果有,输出这样的非重复的元素序列。
For example, 输入数组S = [1, 0, -1, 0, -2, 2], 目标整数target = 0.
返回的结果集是:
[
[-1, 0, 0, 1],
[-2, -1, 1, 2],
[-2, 0, 0, 2]
]
想法
- 本题的思路还是基于3Sum问题延伸出来的。
- 减治思想,如果通过遍历,每次锁定一个元素作为a元素,然后剩下的问题就变成了求三个数的和是否等于target,依次类推。
- 在求cd元素的时候可以通过左右指针减少查找时间。
解法
public List<List<Integer>> fourSum(int[] nums, int target) {
Arrays.sort(nums);
List<List<Integer>> res = new ArrayList<List<Integer>>();
int length = nums.length;
if(length<4 || target > nums[length-1]*4 || target < nums[0]*4)return res;
for(int i=0;i<length-3;i++){
if(i == 0 || (i>0 && nums[i] != nums[i-1])){
for(int j=i+1;j<length-2;j++){
if((j == i+1 || nums[j] != nums[j-1])){
int tempTarget = target-nums[i]-nums[j];
int low = j+1;
int high = length-1;
while(low < high){
if(nums[low]+nums[high] == tempTarget){
res.add(Arrays.asList(nums[i],nums[j],nums[low],nums[high]));
while(low < high && nums[low] == nums[low+1])low++;
while(low < high && nums[high] == nums[high-1])high--;
low++;
high--;
}else if(nums[low] + nums[high] > tempTarget){
high--;
}else{
low++;
}
}
}
}
}
}
return res;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。