力扣第 325 场周赛

126 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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;
    }
};