0
点赞
收藏
分享

微信扫一扫

STM32 (2)

北溟有渔夫 03-05 23:00 阅读 5

一、一层循环+双指针

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        vector<vector<int>> ans;
        for(int i=0;i<nums.size()-2;++i){
            if(nums[i]>0) break;
            if(i>0&&nums[i]==nums[i-1]) continue;
            int right=nums.size()-1;
            int target=-nums[i];
            for(int left=i+1;left<right;++left){
                if(left>i+1&&nums[left]==nums[left-1]) continue;
                while(left<right&&nums[left]+nums[right]>target) --right;
                if(left!=right)
                    if(nums[left]+nums[right]==target) ans.push_back({nums[i],nums[left],nums[right]});
            }
        }
        return ans;
    }
};

二、一层循环+扫一遍的哈希表

class Solution {
public:
    void Insert(set<vector<int>> &ans ,int &a,int & b,int &c){
        vector<int> temp={a,b,c};
        sort(temp.begin(),temp.end());
        ans.insert(temp);
        return;
    }
    vector<vector<int>> threeSum(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        set<vector<int>> ans;
        unordered_map<int,int> hash;
        for(int i=0;i<nums.size();++i){
            if(hash.find(nums[i])==hash.end()){
                hash[nums[i]]=1;
            }else{
                hash[nums[i]]+=1;
            }
        }
        for(int i=0;i<nums.size()-2;++i){
            if(nums[i]>0) break;
            if(i>0&&nums[i]==nums[i-1]) continue;
            for(int j=i+1;j<nums.size()-1;++j){
                if(j>i+1&&nums[j]==nums[j-1]) continue;
                int cur=-nums[i]-nums[j];
                if(hash.find(cur)!=hash.end()){
                    if(cur==nums[i]||cur==nums[j]){
                        if(nums[i]==nums[j]){
                            if(hash[nums[i]]>2) Insert(ans,nums[i],nums[j],cur);
                        }else{
                            if(cur==nums[i]){
                                if(hash[nums[i]]>1) Insert(ans,nums[i],nums[j],cur);
                            }else{
                                if(hash[nums[j]]>1) Insert(ans,nums[i],nums[j],cur);
                            }
                        }
                    }else Insert(ans,nums[i],nums[j],cur);
                }
            }
        }
        vector<vector<int>> result;
        for(auto it=ans.begin();it!=ans.end();++it){
            result.emplace_back(*it);
        }
        return result;
    }
};

三、一层循环+问一遍

清空set,而不是销毁set(Set.clear()),速度更快:

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        vector<vector<int>> res;
        for(int i=0;i<nums.size()-2;i++){
            if(nums[i]>0) break;//减少不必要的判断
            if(i>0 && nums[i]==nums[i-1]){continue;}
            unordered_set<int> Set;//每次创建一个Set,用完这次销毁。
            int target=-nums[i];
            for(int j=i+1;j<nums.size();j++){
                int temp=target-nums[j];
                if(Set.find(temp)!=Set.end()){
                    res.push_back({nums[i],nums[j],temp});
                    while(j<nums.size()-1&&nums[j]==nums[j+1]) ++j;
                }
                else{//else 非必要。此时nums[j]可以被存,因为temp<nums[j],因此nums[j]在后面永远不会被再次考虑,存了也不影响结果
                    Set.insert(nums[j]);
                }
            }
        }
        return res;
    }
};
举报

相关推荐

0 条评论