LeetCode228周赛

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

其实顺序就是 010 和 101 这两种,也就是0在偶数位1在奇数位和1在奇数位0在偶数位,所以分别记录这两种情况,然后返回最小的即可。

class Solution {
public:
    int minOperations(string s) {
        int n=s.size();
        int a=0,b=0;
        for(int i=0;i<n;i++){
            if(i&1){
                if(s[i]=='1') a++;
                else b++;
            }
            else{
                if(s[i]=='1') b++;
                else a++;
            }
        }
        return min(a,b);
    }
};

5677.统计同构子字符串的数目

遍历字符串,如果连续的就加一,不连续就再置为1,统计所有的。

class Solution {
public:
    int countHomogenous(string s) {
        int mod=1e9+7;
        int n=s.size();
        int res=0;
        int t=0;
        for(int i=0;i<n;i++){
            if(i==0 || s[i]==s[i-1])
                t+=1;
            else
                t=1;
            res= (res+t)%mod;
        }
        return res;
    }
};

5678.袋子里最少数目的球

假设每次分y个,一个袋子里x个,那么我们就需要分(x-1)/y 向下取整次,那么要保证在maxOperations之内,我们可以用二分查找的方式,不断去逼近这个y,从而得到的操作次数即为答案。

class Solution {
public:
    int minimumSize(vector<int>& nums, int maxOperations) {
        int l=1,r=1000000000;
        int ans=0;
        while(l<=r){
            int m=(l+r)>>1;
            long long t=0;
            for(int i=0;i<nums.size();i++){
                t+=(nums[i]-1)/m;
            }
            if(t<=maxOperations){
                ans=m;
                r=m-1;
            }
            else{
                l=m+1;
            }
        }
        return ans;
    }
};

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

数据量为400,很显然我们可以用On3的复杂度来做。

于是先将数组转化为邻接矩阵,然后统计所有点的度数。

然后三层循环遍历所有的边,如果符合三元组,则将三个点度数总数减去内部的度数(即6),然后保留每次的最小值。

class Solution {
public:
    int minTrioDegree(int n, vector<vector<int>>& edges) {
        vector<vector<bool>> mp(n+1,vector<bool>(n+1));
        vector<int> degree(n+1);
        for(int i=0;i<edges.size();i++){
            int x=edges[i][0],y=edges[i][1];
            mp[x][y]=mp[y][x]=true;
            degree[x]++;
            degree[y]++;
        }
        int res=INT_MAX;
        int t=0;
        for(int i=1;i<=n;i++){
            for(int j=i+1;j<=n;j++){
                for(int k=j+1;k<=n;k++){
                    if(mp[i][k] && mp[j][k] && mp[i][j])
                    {
                        t=degree[i]+degree[j]+degree[k]-6;
                        res=min(res,t);
                    }
                }
            }
        }
        return res==INT_MAX ? -1 : res;
    }
};

你可能感兴趣的:(字符串,数据结构,leetcode,算法)