第一题:6200. 处理用时最长的那个任务的员工
原题链接
思路:简单模拟,遍历取最大值即可
class Solution { public:int hardestWorker(int n, vector<vector<int>>& logs) {int res = logs[0][0];int sum = logs[0][1];for(int i = 0; i < logs.size() - 1; i++){if(logs[i+1][1] - logs[i][1] > sum){sum = logs[i+1][1] - logs[i][1];//cout<<sum;res = logs[i+1][0];}else if(logs[i+1][1] - logs[i][1] == sum){if(res > logs[i+1][0]) res = logs[i+1][0];}}return res;} };
第二题:
6201. 找出前缀异或的原始数组
原题链接
思路:差分思想或运算即可
class Solution { public:vector<int> findArray(vector<int>& pref) {int n = pref.size();if(n == 1) return pref;vector<int> res(n);res[0] = pref[0];for(int i = n-1; i >= 1; i--) res[i] = pref[i] ^ pref[i-1];return res;} };
第三题:6202. 使用机器人打印字典序最小的字符串
原题链接
思路:贪心和栈的运用,比赛时想复杂了,代码太杂糅导致一直出问题,模拟串t可以定义为栈类型,统计s的字母出现情况,如果后面有更小的字母则接着入栈,否则弹出到答案
class Solution { public:string robotWithString(string s) {string res;int cnt[26] = {0}, min = 0;for(char c : s) cnt[c - 'a']++;stack<char> st;for(char c : s){cnt[c - 'a']--;while(min < 26 && cnt[min] == 0) min++;st.push(c);while(!st.empty() && st.top() - 'a' <= min){res.push_back(st.top());st.pop();}}return res;} };
第四题:6203. 矩阵中和能被 K 整除的路径
原题链接
思路:往下或往右移动一步提示我们用动态规划,dp[i][j][t]
表示以 (i, j)
为终点,且路径和 mod k
等于 t
的路径数,答案就是 dp[n - 1][m - 1][0]。
class Solution { public:int numberOfPaths(vector<vector<int>>& grid, int k) {int mod = 1e9 + 7;int n = grid.size(), m = grid[0].size();int dp[n][m][k];memset(dp,0,sizeof(dp));dp[0][0][grid[0][0] % k] = 1;for(int i = 0; i < n; i++){for(int j = 0; j < m; j++){for(int t = 0; t < k; t++){int tmp = (t - grid[i][j] % k + k) % k; //往下if(i > 0) dp[i][j][t] = (dp[i][j][t] + dp[i-1][j][tmp]) % mod;//往右if(j > 0) dp[i][j][t] = (dp[i][j][t] + dp[i][j-1][tmp]) % mod;}}}return dp[n-1][m-1][0];} };