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;
}
};