Leetcode周赛282

统计包含给定前缀的字符串

thinking

数据量小,直接匹配即可

solution

class Solution {
public:
    bool judge(string &m,string &p) {
        int n1=m.size();
        int n2=p.size();
        if(n1<n2) return false;
        for(int i=0;i<n2;++i) {
            if(m[i]!=p[i]) return false;
        }
        return true;
    }
    int prefixCount(vector<string>& words, string pref) {
        int n=words.size();
        int ans=0;
        for(int i=0;i<n;++i) {
            if(judge(words[i],pref)) ++ans;
        }
        return ans;
    }
};

使两字符串互为字母异位词的最少步骤数

thinking

模拟一下即可

solution

class Solution {
public:
    int minSteps(string s, string t) {
        int a[26]={0};
        int b[26]={0};
        for(auto &val:s) ++a[val-'a'];
        for(auto &val:t) ++b[val-'a'];
        int count=0;
        for(int i=0;i<26;++i) {
            count+=abs(a[i]-b[i]);
        }
        return count;
    }
};

完成旅途的最少时间

ps:直接二分搜索。。。我。。。

thinking

我们考虑二分的边界\([min(time),min(time)*totaltrips]\),直接在该区间进行暴力搜索即可。这。。。

solution

class Solution {
public:
    using ll=long long;
    long long minimumTime(vector<int>& time, int totalTrips) {
        int minnum=*min_element(time.begin(),time.end());
        ll left=minnum;ll right=(ll)minnum*(ll)totalTrips;
        while(left<right) {
            ll get=0;ll mid=(right-left)/2+left;
            for(auto &t:time) {
                get+=mid/t;  //计算在mid时间内,总共有多少的车辆可以满足
            }
            if(get<totalTrips) {
                left=mid+1;
            } else {
                right=mid;//满足的话,我们将right移动到mid的位置,取较小的时间
            }
        }
        return left;
    }
};

完成比赛的最少时间

thinking

动态规划+无限背包???不会了。下面题解参考灵茶山艾府大佬的代码。留在日后补题

solution

class Solution {
public:
    int minimumFinishTime(vector<vector<int>> &tires, int changeTime, int numLaps) {
        vector<int> minSec(18, INT_MAX / 2); // 除二是防止下面计算状态转移时溢出
        for (auto &tire : tires) {
            long time = tire[0];
            for (int x = 1, sum = 0; time <= changeTime + tire[0]; ++x) {
                sum += time;
                minSec[x] = min(minSec[x], sum);
                time *= tire[1];
            }
        }

        vector<int> f(numLaps + 1, INT_MAX);
        f[0] = -changeTime;
        for (int i = 1; i <= numLaps; ++i) {
            for (int j = 1; j <= min(17, i); ++j)
                f[i] = min(f[i], f[i - j] + minSec[j]);
            f[i] += changeTime;
        }
        return f[numLaps];
    }
};

作者:endlesscheng
链接:https://leetcode-cn.com/problems/minimum-time-to-finish-the-race/solution/jie-he-xing-zhi-qiao-miao-dp-by-endlessc-b963/
posted @ 2022-02-27 17:25  圣道  阅读(47)  评论(0)    收藏  举报