力扣228场周赛

情人节力扣给的题还挺友好,能写出来三道,最后一题暴力不会优化。QAQ补题。

5676. 生成交替二进制字符串的最少操作数

一开始想简单了,只判断相邻不相等的就改变成01这种,后来应该是两种情况一种010101…另一种10101010

class Solution {
public:
    int minOperations(string s) {
        int res1=0,res2=0;
        string s1=s,s2=s;
        for(int i=0;i<s.size();i++){
            if(i&1){
                if(s[i]!='0'){
                    s[i]='0';res1++;
                }
            }else{
                if(s[i]!='1'){
                    s[i]='1';res1++;
                }
            }
        }
        for(int i=0;i<s2.size();i++){
            if(i&1){
                if(s2[i]!='1'){
                    res2++;s2[i]='1';
                }
            }else{
                if(s2[i]!='0'){
                    s2[i]='0';res2++;
                }
            }
        }
        cout<<res1<<'-'<<res2<<'\n';
        return min(res1,res2);
    }
};

统计同构子字符串的数目

这题搞了半天没推出来,后来一想只找连续的一段求即可n*(n+1)/2

class Solution {
public:
    const int mod=1e9+7;
    int countHomogenous(string s) {
        int cnt=1;
        long long res=0;
        for(int i=1;i<s.size();i++){
            if(s[i]==s[i-1]){
                cnt++;
            }else{
                res=(res+1ll*cnt*(cnt+1)/2%mod)%mod;
                cnt=1;
            }
        }
        if(cnt){
            res=(res+1ll*cnt*(cnt+1)/2%mod)%mod;
        }
        if(s.size()==1)res=1;
        return (int)res;
    }
};

袋子里最少数目的球

读完题就知道是二分了。

class Solution {
public:
    bool check(int mid,vector<int>num,int op)
    {
        int cnt=0;
        for(auto x:num){
            cnt+=x/mid+(x%mid!=0)-1;
        }
        return cnt<=op;
    }
    int minimumSize(vector<int>& nums, int maxOperations) {
        int l=1,r=1e9,res=-1;
        while(l<=r){
            int mid=(l+r)/2;
            if(check(mid,nums,maxOperations)){
                r=mid-1;res=mid;
            }else l=mid+1;
        }
        return res;
    }
};

5679. 一个图中连通三元组的最小度数

卡在了第四题,一开始也想的暴力,但是不知道怎么优化求三元组的度数。

y总讲解

class Solution {
public:
    bool vis[405][405];
    int du[405];
    int minTrioDegree(int n, vector<vector<int>>& edges) {
        memset(vis,0,sizeof vis);
        memset(du,0,sizeof du);
        for(auto x:edges){
            int u=x[0],v=x[1];
            du[u]++;du[v]++;
            vis[u][v]=vis[v][u]=true;
        }
        int res=0x3f3f3f3f;
        for(int i=1;i<=n;i++){
            for(int j=i+1;j<=n;j++){
                if(!vis[i][j])continue;
                for(int k=j+1;k<=n;k++){
                    if(vis[i][k]&&vis[j][k])res=min(res,du[i]+du[j]+du[k]-6);
                }
            }
        }
        return res==0x3f3f3f3f?-1:res;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_43566782/article/details/113808977