zoukankan      html  css  js  c++  java
  • 16-4SUM

    4.30更新,已经AC
    18. 4Sum My Submissions QuestionEditorial Solution
    Total Accepted: 71102 Total Submissions: 299393 Difficulty: Medium
    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)
    

    结果:

    282 / 282 test cases passed.

    Status: Accepted

    Runtime: 76 ms

    beats:64.95%

    class Solution {
    public:
            vector<vector<int>> fourSum(vector<int>& nums, int target) {
            vector<vector<int> > result;
            sort(nums.begin(),nums.end());
            int n=nums.size();
            for(int i=0;i<n-1;++i){
                for(int j=i+1;j<n;++j){
                    int front = nums[i]+nums[j];
                    int beg = j+1,end = n-1;
                    while(beg<end){
                        int tsum = front + nums[beg]+nums[end];
                        if(tsum==target){
                            vector<int> vec;
                            vec.push_back(nums[i]),vec.push_back(nums[j]);
                            vec.push_back(nums[beg]),vec.push_back(nums[end]);
                            result.push_back(vec);
                            while(++beg<end&&nums[beg-1]==nums[beg]);
                            while(--end>beg&&nums[end+1]==nums[end]);
                        }
                        else {
                            if(tsum<target)beg++;
                            else end--;                         
                        }   
                    }
                }
            }
            sort(result.begin(),result.end());
         result.erase(unique(result.begin(),result.end()),result.end());
            return result;
        }
    };

    思路:先保存两个整数的和,然后两层循环搞定
    平均时间复杂度:O(n2)
    还是time limit,期待更好的解法。。。。

    class Solution {
    public:
        vector<vector<int>> fourSum(vector<int>& nums, int target) {
            vector<vector<int> > result;
            if(nums.size()<4)return result;
            sort(nums.begin(),nums.end());
            map<int,vector<pair<int,int> > > cache;
            for(size_t a=0;a<nums.size();++a){
                for(size_t b=0;b<nums.size();++b){
                    cache[nums[a]+nums[b]].push_back(pair<int,int>(a,b));
                }
            }
            for(int c=0;c<nums.size();++c){
                for(size_t d=c+1;d<nums.size();++d){
                    const int key = target -nums[c]-nums[d];
                    if(cache.find(key)==cache.end())continue;
                    const auto&vec =cache[key];
                    for(size_t k=0;k<vec.size();++k){
                        if(c<=vec[k].second)continue;
                        result.push_back({
                            nums[vec[k].first],nums[vec[k].second],nums[c],nums[d]});
                    }
                }
            }
            sort(result.begin(),result.end());
            result.erase(unique(result.begin(),result.end()),result.end());
            return result;
        }
    };

    testcase:
    [91277418,66271374,38763793,4092006,11415077,60468277,1122637,72398035,62267800,22082642,60359529,16540633,92671879,64462734,55855043,40899846,88007957,57387813,49552230,96789394,18318594,3246760,44346548,21370279,42493875,25185969,83216261,70078020,53687927,76072023,65863359,61708176,29175835,85675811,80575807,92211746,44755622,23368379,23619674,749263,40707953,68966953,72694581,52328726,78618474,40958224,2921736,55902268,74278762,63342010,29076029,58781716,56045007,67966567,79405127,45778231,47167435,1586413,58822903,51277270,87348634,86955956,47418266,74884315,36952674,29067969,98812826,44893101,22516153,34522513,34091871,79583480,47562301,6154068,87601405,48859327,2183204,17736781,31189878,23814871,35880166,39204002,93248899,42067196,49473145,75235452,61923200,64824322,88505198,20903451,80926102,56089387,58094433,37743524,71480010,14975982,19473982,47085913,90793462,33520678,70775566,76347995,16091435,94700640,17183454,85735982,90399615,86251609,68167910,95327478,90586275,99524469,16999817,27815883,88279865,53092631,75125438,44270568,23129316,846252,59608044,90938699,80923976,3534451,6218186,41256179,9165388,11897463,92423776,38991231,6082654,92275443,74040861,77457712,80549965,42515693,69918944,95198414,15677446,52451179,50111167,23732840,39520751,90474508,27860023,65164540,26582346,20183515,99018741,2826130,28461563,24759460,83828963,1739800,71207113,26434787,52931083,33111208,38314304,29429107,5567826,5149750,9582750,85289753,75490866,93202942,85974081,7365682,42953023,21825824,68329208,87994788,3460985,18744871,49724457,12982362,47800372,39958829,95981751,71017359,18397211,27941418,34699076,74174334,96928957,44328607,49293516,39034828,5945763,47046163,10986423,63478877,30677010,21202664,86235407,3164123,8956697,9003909,18929014,73824245]236727523

  • 相关阅读:
    226_翻转二叉树
    199_二叉树的右视图
    145_二叉树的后序遍历
    做IT,网络/系统/数据库/软件开发都得懂
    [恢]hdu 1200
    [恢]hdu 2080
    [恢]hdu 1222
    [恢]hdu 1128
    [恢]hdu 2153
    [恢]hdu 2132
  • 原文地址:https://www.cnblogs.com/freeopen/p/5483001.html
Copyright © 2011-2022 走看看