LeetCode第205场周赛(2020/09/06)

1. 替换所有的问号

LeetCode第205场周赛(2020/09/06)_第1张图片

代码1

class Solution {
     
public:
    string modifyString(string s) {
     
        int N = s.length();
        if(s[0]=='?')
        {
     
            for(int p = 'a'; p<='z'; p++)
            {
     
                if(s[1]!=p)
                {
     
                    s[0] = p; 
                }
            }
        }
        if(s[N-1]=='?')
        {
     
            for(int p = 'a'; p<='z';p++)
            {
     
                if(s[N-2]!=p)
                {
     
                    s[N-1] = p;
                }
            }
        }
        for(int i=1;i<N-1;i++)
        {
     
            if(s[i]=='?')
            {
     
                for(int p = 'a'; p<='z'; p++)
                {
     
                   if(s[i-1]!=p&&s[i+1]!=p)
                       s[i] = p;
                }
            }
        }
        return s;
    }
};

代码2

class Solution {
     
public:
    string modifyString(string s) {
     
        int N = s.length();
        for(int i=0;i<N;i++)
        {
     
            if(s[i] != '?')
                continue;
            char c = 'a';
            while(i&&s[i-1]==c||i<N-1&&s[i+1]==c) ++c;
            s[i] = c;
        }
        return s;
    }
};

2. 数的平方等于两数乘积的方法数

LeetCode第205场周赛(2020/09/06)_第2张图片

思路

哈希表,但是自己的思路不够简洁啊,

代码1

typedef long long LL;
class Solution {
     
public:
    int numTriplets(vector<int>& nums1, vector<int>& nums2) {
     
        map<LL,vector<int>> m1, m2;
        for(int i=0; i<nums1.size(); i++)
        {
     
            m1[(LL)nums1[i]].push_back(i);
        }
        for(int j=0; j<nums2.size(); j++)
        {
     
            m2[(LL)nums2[j]].push_back(j);
        }
        int ans = 0; 
        int add1 = 0;
        int add2 = 0;
        for(int i=0;i<nums1.size();i++)
        {
     
            LL mul = (LL)nums1[i]*(LL)nums1[i];
            for(int j=0;j<nums2.size();j++)
            {
     
                if(mul%(long long)nums2[j]!=0)
                    continue;
                LL num = mul / (LL)nums2[j];
                if(m2.find(num)!=m2.end())
                {
     
                    if(num!=nums2[j])
                        add1+=m2[num].size();
                    else add1+=m2[num].size()-1;
                }
            }
        }
        add1/=2;
        for(int i=0;i<nums2.size();i++)
        {
     
            LL mul = (LL)nums2[i]*(LL)nums2[i];
            for(int j=0;j<nums1.size();j++)
            {
     
                if(mul%(long long)nums1[j]!=0)
                    continue;
                LL num = mul / (LL)nums1[j];
                if(m1.find(num)!=m2.end())
                {
     
                    if(num!=nums1[j])
                       add2+=m1[num].size();
                    else add2+=m1[num].size()-1;
                }
            }
        }
        add2/=2;
        return add1+add2;
    }
};

代码2

typedef long long LL;
class Solution {
     
public:
    int work(vector<int>& v1, vector<int>& v2)
    {
     
        int res = 0;
        unordered_map<LL, int> hash;
        for(int x : v1)
            hash[(LL)x*x]++;
        for(int j=0;j<v2.size();j++)
        {
     
            for(int k=j+1;k<v2.size();k++)
            {
     
                res += hash[(LL)v2[j]*v2[k]];
            }
        }
        return res;
    }
    int numTriplets(vector<int>& nums1, vector<int>& nums2) {
     
        int ans = work(nums1,nums2) + work(nums2,nums1);
        return ans;
    }
};

3. 避免重复字母的最小删除成本

LeetCode第205场周赛(2020/09/06)_第3张图片

代码1

class Solution {
     
public:
    vector<int> costs;
    vector<int> costsum;
    int getminsum(int i, int j)
    {
     
        int maxi = -1;
        for(int start=i;start<=j;start++)
        {
     
            if(costs[start]>maxi)
                maxi = costs[start];
        }
        return costsum[j+1]-costsum[i]-maxi;
    }
    int minCost(string s, vector<int>& cost) {
     
        costs = cost;
        costsum.resize(cost.size()+1);
        for(int i=0;i<cost.size();i++)
        {
     
            costsum[i+1] = costsum[i]+cost[i];
        }
        int ans = 0;
        int N = s.length();
        char prev = s[0];
        int prevind = 0;
        for(int i=1;i<N;i++)
        {
     
            if(s[i]!=prev)
            {
     
                if(i>prevind+1)
                {
     
                    //求prevind~i的最小和
                    ans += getminsum(prevind, i-1);
                }
                prev = s[i];
                prevind = i;
            }
        }
        ans+=getminsum(prevind,N-1);
        return ans;
    }
};

代码2

双指针

class Solution {
     
    public:
     int minCost(string s, vector<int> cost) {
     
        int n = cost.size();
        if (n == 1){
     
            return 0;
        }
        int i = 0;
        int j = 1;
        int res = 0;
        while(j<n)
        {
     
            if(s[i]==s[j])
            {
     
                if(cost[i]<=cost[j])
                {
     
                    //删除i
                    res += cost[i];
                    i = j;
                    j++;
                }
                else{
     
                    //删除j
                    res += cost[j];
                    j++;
                }
            }
            else{
     
                i = j;
                j++;
            }
        }
        return res;
    }
};

4. 保证图可完全遍历

LeetCode第205场周赛(2020/09/06)_第4张图片

思路

最小生成树,利用kruskal算法先选取

代码

class Solution {
     
public:
    vector<int> pa, pb;
    int find(vector<int>&p, int x)
    {
     
        return p[x] == x ? x : p[x] = find(p, p[x]);
    }
    int maxNumEdgesToRemove(int n, vector<vector<int>>& edges) {
     
        pa.resize(n+1);
        pb.resize(n+1);
        for(int i=1;i<=n;i++)
            pa[i] = pb[i] = i;
        int res = 0;
        int ca = n;
        int cb = n;
        for(auto edge:edges)
        {
     
            if(edge[0]==3)
            {
     
                int x = edge[1];
                int y = edge[2];
                int fax = find(pa,x), fay = find(pa, y);
                int fbx = find(pb,x), fby = find(pb, y);
                if(fax!=fay)
                {
     
                    pa[fax] = fay;
                    ca--;
                    pb[fbx] = fby;
                    cb--;
                }else{
     
                    res++;
                }
            }
        }
        for(auto edge:edges)
        {
     
            if(edge[0]==3)
                continue;
            int x = edge[1];
            int y = edge[2];
            if(edge[0]==1)
            {
     
                int fax = find(pa, x), fay = find(pa, y);
                if(fax != fay)
                {
     
                    pa[fax] = fay;
                    ca--;
                }
                else res++;
            }
            else{
     
                int fbx = find(pb, x), fby = find(pb, y);
                if(fbx != fby)
                {
     
                    pb[fbx] = fby;
                    cb--;
                }
                else res++;
            }
        }
        if(ca>1||cb>1)
            return  -1;
        return res;
    }
};

你可能感兴趣的:(leetcode,leetcode周赛)