1. 程式人生 > 實用技巧 >Leetcode 第 205 場周賽

Leetcode 第 205 場周賽

直接模擬
為啥會寫出這種又臭又菜的程式碼


class Solution {
public:
    string modifyString(string s) {
        s += '?';
        string ans="";
        for(int i=0; i<s.size()-1; i++){
            if(i==0){
                if(s[i]!='?')
                    ans += s[i];
                else{
                    for(int j =0; j<26; j++){
                        if('a'+j!=s[i+1]){
                            ans += 'a'+j;
                            break;
                        }
                    }
                }
            }else{
                if(s[i]!='?'){
                    ans += s[i];
                    continue;
                }
                for(int j =0; j<26; j++){
                        if('a'+j!=s[i+1]&&'a'+j!=ans.back()){
                            ans += 'a'+j;
                            break;
                        }
                }
            }
        }
        return ans;
    }
};


反正時間鬆不會超時,就最暴力的玩把


class Solution {
public:
    int numTriplets(vector<int>& nums1, vector<int>& nums2) {
        int ans = 0;
        map<int, int> mmp, mp;
        for(int i=0; i<nums2.size(); i++){
            mmp[nums2[i]] += 1;
        }
        for(int i=0; i<nums1.size(); i++){
            mp.clear();
            for(int j=0; j<nums2.size(); j++){
                mp[nums2[j]] +=1;
                if(((long long)nums1[i]*nums1[i])%nums2[j]!=0)
                    continue;
                else{
                    ans += (mmp[((long long)nums1[i]*nums1[i])/nums2[j]]-mp[((long long)nums1[i]*nums1[i])/nums2[j]]);
                }
            }
        }
        mmp.clear();
        mp.clear();
        for(int i=0; i<nums1.size(); i++){
            mmp[nums1[i]] += 1;
        }
        for(int i=0; i<nums2.size(); i++){
            mp.clear();
            for(int j=0; j<nums1.size(); j++){
                mp[nums1[j]]++;
                if((long long)((long long)nums2[i]*nums2[i])%nums1[j]!=0)
                    continue;
                else{
                    ans += (mmp[((long long)nums2[i]*nums2[i])/nums1[j]]-mp[((long long)nums2[i]*nums2[i])/nums1[j]]);
                }
            }
        }
        return ans;
    }
};

比第一題簡單多了,雙指標貪心


class Solution {
public:
    int minCost(string s, vector<int>& cost) {
        int ans = 0;
        int c = 2147483647;
        int sum = 0;
        int j = 0;
        for(int i=0; i<s.size();){
            c = 0;
            sum = 0;
            while(j<s.size()&&s[j]==s[i]){
                c = max(c, cost[j]);
                sum += cost[j];
                j++;
                
            }
            if(j-i>1){
                cout<<sum-c<<endl;
                ans += sum-c;
               
            }
            i = j;
            if(j==s.size())
                break;
        }
        return ans;
    }
};


直覺就是先用公共的來製造儘量少的連通塊,然後各自分別去把連通塊聯通就可
所以兩次並查集就可解決問題,反正不超時


class Solution {
public:
    vector<int> fa;
    vector<int> fa1;
    
    int find(int x){
        if(fa[x]==-1)
            return x;
        return fa[x] = find(fa[x]);
    }
    int find2(int x){
        if(fa1[x]==-1)
            return x;
        return fa1[x] = find2(fa1[x]);
    }
    int maxNumEdgesToRemove(int n, vector<vector<int>>& edges) {
        //先用第三種邊做並查集求連通塊
        // 這樣計算出了用多少的能用的最省的
        // 然後再看兩個人各自去遍歷圖能否有聯通分支
        int cnt = 0;
        int fa2,fa3;
        int cnt2=0;
        int cnt3=0;
        fa = vector<int>(n+5, -1);
        for(auto e:edges){
            if(e[0]==3){
                int fa2=find(e[1]);
                int fa3 = find(e[2]);
                if(fa2==fa3)
                    continue;
                else{
                    cnt ++;
                    fa[fa2]=fa3;
                }
            }
        }
       if(cnt==n-1)
           return edges.size()-cnt;
        fa1 = fa;
        for(auto e:edges){
            if(e[0]==1){
                fa2=find(e[1]);
                fa3 = find(e[2]);
                if(fa2==fa3)
                    continue;
                cnt2 ++;
                fa[fa2]=fa3;
            }
        }
        for(auto e:edges){
            if(e[0]==2){
                fa2=find2(e[1]);
                fa3 = find2(e[2]);
                if(fa2==fa3)
                    continue;
                cnt3 ++;
                fa1[fa2]=fa3;
            }
        }
        if(cnt+cnt2!=n-1||cnt+cnt3!=n-1)
            return -1;
        return edges.size()-cnt-cnt2-cnt3;
    }
};