力扣:第314场周赛

106 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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],每次将它入栈后,我们有两个选择:

  1. 如果之后没有比他小的字符了,就把这个字符出栈并接到字符串的后面。
  2. 如果之后还有比他小的字符,则什么也不做。

为了方便,我们可以准备一个后缀数组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];
    }
};