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:
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)
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; } }
/** * 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; }
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; } };
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
LeetCode 18 4Sum (C,C++,Java,Python)
原文地址:http://blog.csdn.net/runningtortoises/article/details/45620977