zoukankan      html  css  js  c++  java
  • 15.Three Sum

    思路
    • 直接暴力,(O(n^4 log(n))),不出意外的超时了。。
    class Solution {
    public:
        vector<vector<int>> threeSum(vector<int>& nums) {
            vector<vector<int>> res;
            
            int i,j,k;
            int len = nums.size();
            for(i = 0; i < len; i++){
                for(j = i+1; j < len; j++){
                    for(k = j+1; k < len; k++){
                        if(nums[i]+nums[j]+nums[k] == 0){
                            vector<int> inRes;
                            inRes.push_back(nums[i]);
                            inRes.push_back(nums[j]);
                            inRes.push_back(nums[k]);
                            bool ok = true;
                            for(int m = 0; m < res.size(); m++){
                                if(issame(inRes,res[m])){ 
                                    ok = false;
                                    continue;
                                }
                            }
                            if(ok)  res.push_back(inRes);
                        }
                    }
                }
            }
            return res;
        }
        bool issame(vector<int> a,vector<int> b){
            if(a.size() != b.size()) return false;
            sort(begin(a),end(a));
            sort(begin(b),end(b));
            bool ok = true;
            for(int i = 0; i < a.size(); i++){
                if(a[i] != b[i]){
                    ok = false;
                }
            }
            return ok;
        }
    };
    
    • 利用map暴力,时间复杂度 (O(n^3 log(n))),依然超时。。
    class Solution {
    public:
        vector<vector<int>> threeSum(vector<int>& nums) {
            vector<vector<int>> res;
            map<int,int> tmp;
            int i,j,k;
            int len = nums.size();
            for(i = 0; i < len; i++){
                tmp[nums[i]] = i;
            }
            for(i = 0; i < len; i++){
                for(j = i+1; j < len; j++){
                        vector<int> inRes = {};
                        if(tmp.find(-(nums[i]+nums[j])) != tmp.end() && tmp[-(nums[i]+nums[j])] != i && tmp[-(nums[i]+nums[j])] != j){
                                inRes.push_back(nums[i]);
                                inRes.push_back(nums[j]);
                                inRes.push_back(-(nums[i]+nums[j]));  
                                bool ok = true;
                            for(int m = 0; m < res.size(); m++){
                                if(issame(inRes,res[m])) ok = false;   
                            }
                            if(ok){
                                res.push_back(inRes);
                             }
                        }
                        
            }
        }
        return res;
    }
        bool issame(vector<int> a,vector<int> b){
            if(a.size() != b.size()) return false;
            sort(begin(a),end(a));
            sort(begin(b),end(b));
            bool ok = true;
            for(int i = 0; i < a.size(); i++){
                if(a[i] != b[i]){
                    ok = false;
                }
            }
            return ok;
        }
    };
    
    • 利用3个指针,首先固定一个,然后类似于Two Sum问题。(这里是用map存储返回结果的,需要避免重复的问题,而直接用set存储就方便许多了),复杂度为 (O(n^2)),如果用set的话,复杂度应该是 (O(n^3))
    class Solution {
    public:
        vector<vector<int>> threeSum(vector<int>& nums) {
            int i,lo,hi;
            int len = nums.size();
            sort(nums.begin(), nums.end());
            vector<vector<int>> res;
            
            for(int i = 0; i < len-2; i++){
                int lo = i+1,hi = len-1;
                int sum = -nums[i];
                if(i == 0 || (nums[i] != nums[i-1] && i > 0)){
                while(lo < hi){
                    if((nums[lo] + nums[hi]) == sum){
                        vector<int> tmp;
                        tmp.push_back(nums[i]);
                        tmp.push_back(nums[lo]);
                        tmp.push_back(nums[hi]);
                        cout << tmp[0] << " " << tmp[1] <<" " << tmp[2] << endl;
                        res.push_back(tmp);
                        while(lo < hi && nums[lo] == nums[lo+1]){
                            lo++;
                        }
                        while(lo < hi && nums[hi] == nums[hi-1]){
                            hi--;
                        }
                        lo++;hi--;
                    }
                    else if ((nums[lo]+nums[hi]) < sum)
                    {
                        lo++;
                    }else hi--;
                }
            }
            }
            return res;
        }
    };
    
  • 相关阅读:
    秒杀项目之——通过令牌发放机制,控制秒杀大闸以及队列泄洪
    Guava的使用
    秒杀项目之细节随笔记录————
    redis搭建集群
    redis内存满了怎么办?
    多个电脑上免密登陆命令、scp远程拷贝、修改文件的用户和组
    克隆完虚拟机后修改网卡,修改静态IP
    redis基本操作和 过期时间设置以及持久化方案
    linux操作系统安装运行Redis
    云服务器以及linux操作系统打开防火墙,在墙上开一个小口
  • 原文地址:https://www.cnblogs.com/UniMilky/p/6951664.html
Copyright © 2011-2022 走看看