Problem:
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:
- Elements in a quadruplet (a,b,c,d) must be in non-descending order. (ie, a ≤ b ≤ c ≤ d)
- 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)
Solution:
与15题3Sum很相似,只不过多了一重循环,详见:
点击打开链接
题目大意:
给一个数组,和一个target整数,求数组中能够使得和为target的所有组合a,b,c,d并满足a<=b<=c<=d
Java源代码(527ms):
public class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
List<List<Integer>> res=new ArrayList<List<Integer>>();
int length=nums.length;
if(length<4)return res;
Arrays.sort(nums);
for(int i=0;i<length-3;i++){
if(i>0 && nums[i]==nums[i-1])continue;
for(int j=i+1;j<length-2;j++){
if(j>i+1 && nums[j]==nums[j-1])continue;
int begin=j+1,end=length-1;
while(begin<end){
int sum=nums[i]+nums[j]+nums[begin]+nums[end];
if(sum==target){
List<Integer> temp = new ArrayList<Integer>();
temp.add(nums[i]);
temp.add(nums[j]);
temp.add(nums[begin]);
temp.add(nums[end]);
res.add(temp);
begin++;end--;
while(begin<end && nums[begin]==nums[begin-1])begin++;
while(begin<end && nums[end]==nums[end+1])end--;
}else if(sum>target){
end--;
while(begin<end && nums[end]==nums[end+1])end--;
}else{
begin++;
while(begin<end && nums[begin]==nums[begin-1])begin++;
}
}
}
}
return res;
}
}
C语言源代码(用时48ms):
/**
* Return an array of arrays of size *returnSize.
* Note: The returned array must be malloced, assume caller calls free().
*/
void quickSort(int* nums,int start,int end){
int l=start,r=end,tmp=nums[l];
if(start>=end)return;
while(l<r){
while(l<r && nums[r]>=tmp)r--;
if(l<r)nums[l]=nums[r];
while(l<r && nums[l]<=tmp)l++;
if(l<r)nums[r]=nums[l];
}
nums[l]=tmp;
quickSort(nums,start,l-1);
quickSort(nums,l+1,end);
}
int** fourSum(int* nums, int numsSize, int target, int* returnSize) {
int** res = (int**)malloc(sizeof(int*)*1000000);
int i,j,sum,begin,end,*temp;
*returnSize=0;
if(numsSize<4)return res;
quickSort(nums,0,numsSize-1);
for(i=0;i<numsSize-3;i++){
if(i>0 && nums[i]==nums[i-1])continue;
for(j=i+1;j<numsSize-2;j++){
if(j>i+1 && nums[j]==nums[j-1])continue;
begin=j+1;end=numsSize-1;
while(begin<end){
sum=nums[i]+nums[j]+nums[begin]+nums[end];
if(sum==target){
temp=(int*)malloc(sizeof(int)*4);
temp[0]=nums[i];temp[1]=nums[j];temp[2]=nums[begin];temp[3]=nums[end];
res[*returnSize]=temp;
(*returnSize)++;
begin++;end--;
while(begin<end && nums[begin]==nums[begin-1])begin++;
while(begin<end && nums[end]==nums[end+1])end--;
}else if(sum>target){
end--;
while(begin<end && nums[end]==nums[end+1])end--;
}
else{
begin++;
while(begin<end && nums[begin]==nums[begin-1])begin++;
}
}
}
}
return res;
}
C++源代码(141ms):
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>> res;
int length=nums.size();
if(length<4)return res;
sort(nums.begin(),nums.end());
for(int i=0;i<length-3;i++){
if(i>0 && nums[i]==nums[i-1])continue;
for(int j=i+1;j<length-2;j++){
if(j>i+1 && nums[j]==nums[j-1])continue;
int begin=j+1,end=length-1;
while(begin<end){
int sum=nums[i]+nums[j]+nums[begin]+nums[end];
if(sum==target){
vector<int> temp;
temp.push_back(nums[i]);
temp.push_back(nums[j]);
temp.push_back(nums[begin]);
temp.push_back(nums[end]);
res.push_back(temp);
begin++;end--;
while(begin<end && nums[begin]==nums[begin-1])begin++;
while(begin<end && nums[end]==nums[end+1])end++;
}else if(sum>target){
end--;
while(begin<end && nums[end]==nums[end+1])end--;
}else{
begin++;
while(begin<end && nums[begin]==nums[begin-1])begin++;
}
}
}
}
return res;
}
};
Python源代码(1842ms):
class Solution:
# @param {integer[]} nums
# @param {integer} target
# @return {integer[][]}
def fourSum(self, nums, target):
length=len(nums)
res=[]
if length<4:return res
nums=sorted(nums)
for i in range(length-3):
if i>0 and nums[i]==nums[i-1]:continue
for j in range(i+1,length-2):
if j>i+1 and nums[j]==nums[j-1]:continue
begin=j+1;end=length-1
while begin < end:
sum=nums[i]+nums[j]+nums[begin]+nums[end]
if sum==target:
temp=[nums[i],nums[j],nums[begin],nums[end]]
res.append(temp)
begin+=1;end-=1
while begin<end and nums[begin]==nums[begin-1]:begin+=1
while begin<end and nums[end]==nums[end+1]:end-=1
elif sum>target:
end-=1
while begin<end and nums[end]==nums[end+1]:end-=1
else:
begin+=1
while begin<end and nums[begin]==nums[begin-1]:begin+=1
return res