• 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;
        }
    };
    
  • 相关阅读:
    获得音视频信息
    stf-多设备管理平台搭建
    接口用例设计
    阿里云Ubuntu服务器搭建SVN
    Jenkins首次启动卡在加载页面
    初使Jenkins构建Python项目
    MongoDB使用python脚本写入数据
    python re操作
    使用Python脚本写入MongoDB数据
    chromedriver与chrome版本对应表及下载地址
  • 原文地址:https://www.cnblogs.com/UniMilky/p/6951664.html
Copyright © 2020-2023  润新知