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/

浙公网安备 33010602011771号