持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第11天,点击查看活动详情
力扣——第314场周赛
6200. 处理用时最长的那个任务的员工 - 力扣(LeetCode)
问题解析
遍历logs数组,计算每个任务的用时,维护用时最长的员工id,如果最长用时一样,选小的id。
AC代码
class Solution {
public:
int hardestWorker(int n, vector<vector<int>>& logs) {
int idx=logs[0][0],mx=logs[0][1],num;
int m=logs.size();
for(int i=1;i<m;i++)
{
num=logs[i][1]-logs[i-1][1];
if(num>mx)
{
mx=num;
idx=logs[i][0];
}
else if(num==mx)
{
idx=min(idx,logs[i][0]);
}
}
return idx;
}
};
6201. 找出前缀异或的原始数组 - 力扣(LeetCode)
问题解析
对于答案数组v:
- v[0]=pref[0];
- v[i]=pref[i]^pref[i-1];
AC代码
class Solution {
public:
vector<int> findArray(vector<int>& pref) {
int n=pref.size();
vector<int>v(n);
v[0]=pref[0];
for(int i=1;i<n;i++)
{
v[i]=pref[i]^pref[i-1];
}
return v;
}
};
6202. 使用机器人打印字典序最小的字符串 - 力扣(LeetCode)
问题解析
这一题,其实是让我们求最小字典序的出栈序列。
遍历字符串s,对于字符s[i],每次将它入栈后,我们有两个选择:
- 如果之后没有比他小的字符了,就把这个字符出栈并接到字符串的后面。
- 如果之后还有比他小的字符,则什么也不做。
为了方便,我们可以准备一个后缀数组f,f[i]表示:第i个字符开始到结尾的最小字符是f[i]。
这样当我们遍历s时,只要比较s[i]和f[i]的大小即可。
AC代码
class Solution {
public:
int f[100050];
string robotWithString(string s) {
int n=s.size();
f[n]=10000;
for(int i=n-1;i>=0;i--)f[i]=min(f[i+1],s[i]-'a');
stack<char>sta;
string str;
for(int i=0;i<n;i++)
{
sta.push(s[i]);
while(!sta.empty()&&sta.top()-'a'<=f[i+1])
{
str+=sta.top();
sta.pop();
}
}
return str;
}
};
6203. 矩阵中和能被 K 整除的路径 - 力扣(LeetCode)
问题解析
开辟一个三维数组f,f[i] [j] [x]表示到达第i行第j列时,路径总和mod k为x的路径有f[i] [j] [x]条。
遍历矩阵grid,到达新的格子时枚举x,状态转移方程为:
f[i][j][(x+grid[i-1][j-1])%k]+=(f[i-1][j][x]+f[i][j-1][x])
最后答案就为f[n] [m] [0]。注意取模问题。
(不过由于数据n和m的上限太大,虽然n*m最大为5e4,但是n和m最大都可以取到5e4,如果用一般的数组,则预留大小为:5e4 *5e4 *50,显然不行。所以对于每个测试例,我们可以先获取n和m的具体值,然后用vector容器来开辟数组)
AC代码
class Solution {
public:
int MOD=1e9+7;
int numberOfPaths(vector<vector<int>>& grid, int k) {
int n=grid.size(),m=grid[0].size();
vector<vector<vector<int>>>f(n + 1, vector<vector<int>>(m + 1,vector<int>(k+1)));
f[1][1][grid[0][0]%k]=1;
for(int i=2;i<=n;i++)
{
for(int j=k-1;j>=0;j--)
{
f[i][1][(j+grid[i-1][0])%k]+=f[i-1][1][j];
}
}
for(int i=2;i<=m;i++)
{
for(int j=k-1;j>=0;j--)
{
f[1][i][(j+grid[0][i-1])%k]+=f[1][i-1][j];
}
}
for(int i=2;i<=n;i++)
{
for(int j=2;j<=m;j++)
{
for(int x=k-1;x>=0;x--)
{
int y=(f[i-1][j][x]+f[i][j-1][x])%MOD;
f[i][j][(x+grid[i-1][j-1])%k]=(f[i][j][(x+grid[i-1][j-1])%k]+y)%MOD;
}
}
}
return f[n][m][0];
}
};