情人节力扣给的题还挺友好,能写出来三道,最后一题暴力不会优化。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. 一个图中连通三元组的最小度数
卡在了第四题,一开始也想的暴力,但是不知道怎么优化求三元组的度数。
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;
}
};