• LeetCode 18 4Sum


    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, abcd)
    • 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)
    
    第一想法是利用3sum的算法,在s中选出一个数elem,求出res=target-elem,然后在剩下的元素中利用3sum的方法查找,但是实现的时候出现了重复,
    例如target = 0时, elem= -1,此时res= 1, 能够找到-1 0 0 1, 但是elem=1时,也能找到 -1 0 0 1,如何删除这种重复?
    最终实现网上提供的方法,先排序,在按照顺序, 利用分治法来查找。
     vector<vector<int>> fourSum(vector<int>& nums, int target) 
    {
        vector<vector<int>> ret;
        int iPrevious = 0;
        if(nums.size() < 4)
        {
            return ret;
        }
        vector<int> mid(4, 0);
        set<string> intSet;
    
        insertsort3(nums);
        for(int j = 0; j!= nums.size() -3 ; ++j)
        {
            mid[0] = nums[j];
            
            for(int i = j+1; i!= nums.size() -2; ++i)
            {
               mid[1] = nums[i];
               int res = target  -  mid[0] - mid[1];
               int p = i+1;
               int q = nums.size()-1;
                while(p < q)
                {
                    int s3 = nums[p] + nums[q];
        
                    if(res < s3)
                    {
                        --q;
                    }
                    else if(res > s3)
                    {
                        ++p;
                    }
                    else
                    {
                        string str;
                        str += mid[0];
                        str += mid[1];
                        str += nums[p];
                        str += nums[q];
                        set<string>::iterator iter = intSet.find(str);
                        if(iter == intSet.end())
                        {
                            intSet.insert(str);
                            mid[2] = nums[p];
                            mid[3] = nums[q];
                            ret.push_back(mid);
                        }
                        ++p  ;
                        --q  ; 
                    }
                }
            }
        }
        return ret;
    }
    void insertsort3(vector<int> &nums)
    {
        int j = 0;
    
        for(int i= 1; i != nums.size(); i++)
        {
            int temp = nums[i];
            for(j=i; j>0 && temp < nums[j-1]; --j)
            {
                nums[j] = nums[j-1];
            }
            nums[j] = temp;
        }
    }
    排序算法是个基础。
    
    
  • 相关阅读:
    python 垃圾回收装置
    文件夹同步/备份软件推荐 (SyncToy/FreeFileSync/Compare Advance/GoodSync/Allway Sync/Compare Advance)
    WCF的ABC
    NPOI导出多表头Execl(通过html表格遍历表头)
    分布式应用处理方式
    再探ASP.NET 5(转载)
    应聘.net开发工程师常见的面试题(五)
    应聘.net开发工程师常见的面试题(四)
    应聘.net开发工程师常见的面试题(二)(转载)
    应聘.net开发工程师常见的面试题(一)(转载)
  • 原文地址:https://www.cnblogs.com/bestwangjie/p/4492152.html
Copyright © 2020-2023  润新知