开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第19天,点击查看活动详情
6269. 到目标字符串的最短距离 - 力扣(LeetCode)
思路:向左向右分别跑一边输出最小值即可
class Solution {
public:
int closetTarget(vector<string>& words, string target, int startIndex) {
int flag=0;
for(int i=0;i<words.size();i++)
{
if(words[i]==target){flag=1;break;}
}
if(flag==0) return -1;
int x=startIndex,res1=0,ans=1e9,n=words.size();
while(words[x]!=target)
{
res1++;x=(x+1)%n;
}
ans=min(ans,res1);
x=startIndex,res1=0;
while(words[x]!=target)
{
res1++;x=(x-1+n)%n;
}
ans=min(ans,res1);
return ans;
}
};
每种字符至少取 K 个 - 力扣 (LeetCode) 竞赛
思路:可以发现只需要看看左边和右边最少需要删多少个就行,枚举左边删了几个数看看右边最少需要删几个数就可以,具体操作为枚举i表示左边删了i个数,然后r从r往后的数字都被删掉,如果当前的i和r满足条件r就++,直到不能加了之后更新答案,除此之外要注意一些细节,当然代码写的足够好的话这些细节坑点可能就不存在了,另外不要忘了特判-1
class Solution {
public:
int takeCharacters(string s, int k) {
int n=s.size();
s=" "+s;
int sum[4][100005];
sum[1][0]=sum[2][0]=sum[3][0]=0;
for(int i=1;i<=n;i++)
{
sum[1][i]=sum[1][i-1]+(s[i]=='a');
sum[2][i]=sum[2][i-1]+(s[i]=='b');
sum[3][i]=sum[3][i-1]+(s[i]=='c');
}
if(sum[1][n]<k||sum[2][n]<k||sum[3][n]<k) return -1;
if(k==0) return 0;
int a=0,b=0,c=0,r=1,ans=1e9;
for(int i=0;i<=n;i++)
{
if(i>0)
{
if(s[i]=='a') a++;
else if(s[i]=='b') b++;
else c++;
}
r=max(r,i+1);
while(r<=n+1)
{
int A=sum[1][n]-sum[1][r-1]+a;
int B=sum[2][n]-sum[2][r-1]+b;
int C=sum[3][n]-sum[3][r-1]+c;
//cout<<A<<" "<<B<<" "<<C<<" "<<r<<" "<<i<<endl;
if(A<k||B<k||C<k)
{
r--;
break;
}
r++;
}
if(r==n+2) r--;
ans=min(ans,i+n-r+1);
//cout<<r<<" "<<i<<" "<<ans<<endl;
}
return ans;
}
};
6271. 礼盒的最大甜蜜度 - 力扣(LeetCode)
思路:二分答案,先对数组排一个序,然后先挑出最小的也就是v[0],让las=v[0],然后遍历数组,如果v[i]-las>=x(x为二分的答案),那么res++,las=v[i],遍历结束后看看res是否大于等于k,大于等于就说明这个答案符合条件,不然就不符合
class Solution {
public:
bool check(int x,vector<int>& v,int k)
{
int res=1,las=v[0];
for(int i=1;i<v.size();i++)
{
if(v[i]-las>=x) res++,las=v[i];
}
return res>=k;
}
int maximumTastiness(vector<int>& price, int k) {
sort(price.begin(),price.end());
int ans=0,l=0,r=1e9;
while(l<=r)
{
int mid=l+r>>1;
if(check(mid,price,k)) ans=mid,l=mid+1;
else r=mid-1;
}
return ans;
}
};