LeetCode18. 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.

做法1:基于3sum的做法,嵌个套找每个数对应的3sum即可,用时O(N^3).

vector<vector<int>> fourSum(vector<int>& nums, int target) {
        sort(nums.begin(),nums.end());
        int n=nums.size();
        vector<vector<int>> anss;
        unordered_map<int,int>check;
        for(int k=0;k<n;k++){
            if(check.find(nums[k])!=check.end())continue;
            check[nums[k]]=k;
            int aims=target-nums[k];
            unordered_map<int,int> check1;
            unordered_map<int,int> check2;
            for(int i=k+1;i<n;i++){
                if(check1.find(nums[i])!=check1.end())continue;
                check1[nums[i]]=i;
                int tar=aims-nums[i];
                int l=i+1;
                int h=n-1;
                check2.clear();
                while(l<h){
                    if(check2.find(nums[l])!=check2.end()&&check2.find(nums[h])!=check2.end()){
                        l++;h--;
                        continue;
                    }
                    int temp=nums[l]+nums[h];
                    if(temp==tar){
                        vector<int> tmp;
                        tmp.push_back(nums[k]);
                        tmp.push_back(nums[i]);
                        tmp.push_back(nums[l]);
                        tmp.push_back(nums[h]);
                        anss.push_back(tmp);
                        check2[nums[l]]=l;
                        check2[nums[h]]=h;
                        l++;h--;
                    }
                    if(temp>tar)h--;
                    if(temp<tar)l++;
                }
            }
        } 
        return anss;
    }    

做法2:将所有2sum的结果找出来保存到新的位置,然后从中再找一次2sum,用时O(N^2+N)=O(N^2)。需要注意的是,两个2sum可能有相同的加数因子,所以需要记录下标,不要使用具有相同加数因子的2sum来求4sum。但是其实要记录下标也很麻烦,因为每种2sum和对应的两个加数可能不同,我们需要把他们都记下来。进行第二次2sum比较的时候,从两个2sum中找出所有的组合,这些组合都等于target,然后再比较下标是否有重复……最后还要擦除重复,着实是非常麻烦了……所以虽然看上去很快,但是做了许多复杂的操作之后,速度也没怎么快……
class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        unordered_map<int,vector<vector<int>>>index;//保存所有2sum组合的下标
        unordered_map<int,vector<vector<int>>>adds;//保存所有2sum组合的两个加数
        int n=nums.size();
        vector<vector<int>> anss;
        vector<int> newNums;//保存所有的2sum
        for(int i=0;i<n;i++){
            for(int j=i+1;j<n;j++){
                int sum2=nums[i]+nums[j];
                newNums.push_back(sum2);
                index[sum2].push_back({i,j});
                adds[sum2].push_back({nums[i],nums[j]});
            }
        }
        sort(newNums.begin(),newNums.end());
        int m=newNums.size();
        int l=0,h=m-1,a,b,c,d;
        while(l<h){
            int sum4=newNums[l]+newNums[h];
            if(sum4==target){
                for(int i=0;i<index[newNums[l]].size();i++){
                    a=index[newNums[l]][i][0];
                    b=index[newNums[l]][i][1];
                    for(int j=0;j<index[newNums[h]].size();j++){
                        c=index[newNums[h]][j][0];
                        d=index[newNums[h]][j][1];
                        if(a!=c&&a!=d&&b!=c&&b!=d){
                            vector<int>tmp;
                            tmp.push_back(adds[newNums[l]][i][0]);
                            tmp.push_back(adds[newNums[l]][i][1]);
                            tmp.push_back(adds[newNums[h]][j][0]);
                            tmp.push_back(adds[newNums[h]][j][1]);
                            sort(tmp.begin(),tmp.end());
                            anss.push_back(tmp);
                        }
                    }
                }
                l++;h--;
            }
            if(sum4<target)l++;
            if(sum4>target)h--;
        }
        sort(anss.begin(),anss.end());
        anss.erase(unique(anss.begin(),anss.end()),anss.end());
        return anss;
    }    
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
牙科就诊管理系统利用当下成熟完善的SSM框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的Mysql数据库进行程序开发。实现了用户在线查看数据。管理员管理病例管理、字典管理、公告管理、药单管理、药品管理、药品收藏管理、药品评价管理、药品订单管理、牙医管理、牙医收藏管理、牙医评价管理、牙医挂号管理、用户管理、管理员管理等功能。牙科就诊管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 管理员在后台主要管理病例管理、字典管理、公告管理、药单管理、药品管理、药品收藏管理、药品评价管理、药品订单管理、牙医管理、牙医收藏管理、牙医评价管理、牙医挂号管理、用户管理、管理员管理等。 牙医列表页面,此页面提供给管理员的功能有:查看牙医、新增牙医、修改牙医、删除牙医等。公告信息管理页面提供的功能操作有:新增公告,修改公告,删除公告操作。公告类型管理页面显示所有公告类型,在此页面既可以让管理员添加新的公告信息类型,也能对已有的公告类型信息执行编辑更新,失效的公告类型信息也能让管理员快速删除。药品管理页面,此页面提供给管理员的功能有:新增药品,修改药品,删除药品。药品类型管理页面,此页面提供给管理员的功能有:新增药品类型,修改药品类型,删除药品类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值