码迷,mamicode.com
首页 > 编程语言 > 详细

LeetCode 18 4Sum (C,C++,Java,Python)

时间:2015-05-10 15:47:36      阅读:106      评论:0      收藏:0      [点我收藏+]

标签:c   c++   java   leetcode   python   

Problem:

Given an array S of n integers, are there elements abc, 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


LeetCode 18 4Sum (C,C++,Java,Python)

标签:c   c++   java   leetcode   python   

原文地址:http://blog.csdn.net/runningtortoises/article/details/45620977

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!