题目链接

竞赛 - 力扣 (LeetCode)

题目解析

A.6200. 处理用时最长的那个任务的员工

AC代码

class Solution {public:int hardestWorker(int n, vector<vector<int>>& logs) {vector<int> cnt(n, 0);int ans = -1, ansCnt = -1;int last = 0, t;for (auto &arr : logs) {t = arr[1] - last;if (t > ansCnt) {ansCnt = t;ans = arr[0];} else if (t == ansCnt && arr[0] < ans) {ans = arr[0];}last = arr[1];}return ans;}
};

思路分析

其实是一道很简单的题目,但是我没有认真读题竟然还wa了两次,觉得非常不应该。一直以来觉得第一道题非常简单于是写的时候都没有想太多,今天抱着同样的态度结果没有搞清楚题目意思就开始写,wa两次的罚时远远大于认真思考的时间。一定要认真谨慎,不管在面对什么问题。

B.6201. 找出前缀异或的原始数组

AC代码

class Solution {public:vector<int> findArray(vector<int>& pref) {int n = pref.size();vector<int> ans(n);ans[0] = pref[0];for (int i = 1; i < n; ++i) {ans[i] = pref[i] ^ pref[i - 1];}return ans;}};

思路分析

根据异或的性质很快可以得出ans[i]=pref[i]^pref[i - 1]

C.6202. 使用机器人打印字典序最小的字符串

AC代码

class Solution {public:string robotWithString(string s) {int n = s.size();vector<pair<char, int>> cnt(n);cnt[n - 1] = make_pair(s[n - 1], n - 1);for (int i = n - 2; i >= 0; --i) {if (s[i] <= cnt[i + 1].first) {cnt[i] = make_pair(s[i], i);} else {cnt[i] = cnt[i + 1];}}string t;t.push_back('z' + 1);string ans;int idx = 0;while (idx < n) {auto [c, small] = cnt[idx];if (c < t.back()) {for (int i = idx; i < small; ++i) t.push_back(s[i]);ans.push_back(c);idx = small + 1;} else {ans.push_back(t.back());t.pop_back();}}int nn = t.size();for (int i = nn - 1; i > 0; --i) ans.push_back(t[i]);return ans;}
};

思路分析

一个贪心+模拟,主要的贪心策略就是:为当前位置放置可以放置的最小字符。这个字符的来源有两个:一个是s,一个是t,如果在s中,那么我们就要将最小字符前面的字符放在t中,而t只能取最后一个字符。为了确定来自哪里,我们从后往前处理出s当前位置后面最小的字符是哪个

初始情况下s中的任意字符都比t小,为了避免复杂的判断,这里技巧性地给t中先验性地填入了一个最大字符(’z’ + 1)。总体来说还是实现的比较优雅的。

D.6203. 矩阵中和能被 K 整除的路径

AC代码

class Solution {public:int numberOfPaths(vector<vector<int>>& grid, int k) {using ll = long long;static constexpr ll MOD = 1e9 + 7;int n = grid.size();int m = grid[0].size();vector<vector<ll>> dp(m, vector<ll>(k));auto update0 = [&](vector<ll> &now, int t) {vector<ll> last(k);for (int i = 0; i < k; ++i) {last[(i + t) % k] += now[i];}now.swap(last);};auto update1 = [&](vector<ll> &now, const vector<ll> &last, int t) {for (int i = 0; i < k; ++i) {int tmp = (i + t) % k;now[tmp] += last[i];if (now[tmp] > MOD) {now[tmp] %= MOD;}}};auto deal = [&](int x, int y, int dir) {if (dir == 0) {//从上方更新update0(dp[y], grid[x][y]);} else {//从左方更新update1(dp[y], dp[y - 1], grid[x][y]);}};dp[0][grid[0][0] % k] = 1;for (int j = 1; j < m; ++j) {deal(0, j, 1);}for (int i = 1; i < n; ++i) {deal(i, 0, 0);for (int j = 1; j < m; ++j) {deal(i, j, 0);deal(i, j, 1);}}return dp[m - 1][0];}
};

思路分析

很浓重的dp色彩,每一个位置从上边或者左边转移而来。可能朴素的做法是维护所有路径的和,但是由于我们要判断的是是否整除,因此技巧性地不断对和取余,维护的是k的剩余系,这样有效地缩小了每个状态的大小。

除此之外,由于我们是按照从左到右,从上到下的搜索顺序,所以我们可以利用滚动数组优化空间复杂度,只保存每一行的状态,然后优先从上边更新(也就是自身),再从左边更新。

自己在优先的时间内还能够想到这种优化空间复杂度的做法,的确是很机智。

整体代码的实现也是比较好的,用lambda表达式封装更新动作。

就是在初始状态的更新上犯了一点点错误。而且还把1e9+7写成了109+7,我记得我之前就因为这个问题wa过,这次又犯。。。主要是题面给的就是109+7,我吐了。害得我debug好久才发现这个问题。

周赛总结

优点

  • 思路敏捷,代码实现快速,代码结构清晰

缺点

  • 轻视简单题造成不必要的罚时
  • 因为细节问题导致出错,应该再小心谨慎些

改进方案

小心谨慎,注意题面,注意数据范围,注意初始状态

Leetcode第314场周赛相关推荐

  1. Acwing第72场周赛+Leetcode第314场周赛

    Acwing第72场周赛 第一题:AcWing 4624. 最小值 分析:向下取整可以用到math.h头文件中的floor()函数,最后输出时套用两个min()函数求三个数的最小值即可. 代码: #i ...

  2. [LeetCode周赛复盘] 第 314 场周赛20221009

    [LeetCode周赛复盘] 第 314 场周赛20221009 一.本周周赛总结 二. [Easy] 6201. 找出前缀异或的原始数组 1. 题目描述 2. 思路分析 3. 代码实现 三.[Eas ...

  3. 力扣 第314场周赛 Q3 使用机器人打印字典序最小的字符串【难度:中等,rating: 1953】(栈+贪心)

    题目链接 https://leetcode.cn/problems/using-a-robot-to-print-the-lexicographically-smallest-string/ 题目来源 ...

  4. LeetCode第 227 场周赛题解

    LeetCode第 227 场周赛题解 检查数组是否经排序和轮转得到 原题链接 https://leetcode-cn.com/problems/check-if-array-is-sorted-an ...

  5. LeetCode 第 194 场周赛

    LeetCode 第 194 场周赛 数组异或操作 思路和代码 保证文件名唯一 思路及代码 避免洪水泛滥 思路及代码 找到最小生成树里的关键边和伪关键边 思路及代码 这次周赛比以往难很多. 数组异或操 ...

  6. LeetCode第187场周赛(Weekly Contest 187)解题报告

    差点又要掉分了,还好最后几分钟的时候,绝杀 AK.干巴爹!!! 第一题:思路 + 模拟暴力. 第二题:线性扫描. 第三题:双指针(滑动窗口) + 优先队列. 第四题:暴力每一行最小 k 个 + 优先队 ...

  7. Leetcode第 310 场周赛 补打

    Leetcode 第310场周赛 自己赛后打了一下,记录了一下时间,大概15min A 3题,第四题是写不出来,然后学习了一天线段树(真的强). 思路: 1.排序后统计偶数的数目 2.遍历扫一遍,用直 ...

  8. LeetCode第176场周赛(Weekly Contest 176)解题报告

    又是一周掉分之旅,我发现,LeetCode周赛的数据好水,所以有的时候,实在没思路,先暴力解决试试(即使分析出时间复杂度会超时),比如第二题和第三题都可以暴力通过,GG思密达. 这周主要使用了数据结构 ...

  9. Leetcode第321场周赛补题

    Leetcode第321场周赛补题 第一题:6245. 找出中枢整数 - 力扣(LeetCode) 分析:由于数组中是差值为1的等差数列,所以可以直接用等差数列求和公式的朴素法更加简便的解决这题,,其 ...

最新文章

  1. 科技互联网公司越来越重视数学了,贾扬清等大牛如是说!
  2. webservice入门程序学习中经验总结
  3. Feature Support and Procedure Mapping
  4. 【Linux】Linux基本命令(一)
  5. 同工不同酬,年薪 50 万美金的工程师到底有什么神本事?
  6. Qt5.7+Opencv2.4.9人脸识别(二)人脸采集
  7. php找不到intl,php_intl.dll找不到指定模块怎么办
  8. android 今日头条布局,Android今日头条UI适配完善版
  9. import/export win7中电源计划
  10. 基于STM32F103——SIM900A发送短信+串口打印
  11. idea和搜狗输入法快捷键冲突_Win10 输入法简繁体快捷键与 IDEA 冲突
  12. [数图] 实验四 图像的滤波处理与图像空间变换
  13. 服务器2008系统安全狗,win2008 r2 服务器安全设置之安全狗设置图文教程
  14. canvas绘制文本文本的
  15. iOS8 苹果自带的毛玻璃效果
  16. Kotlin协程在项目中的实际应用
  17. JAVA练习题17:文字版格斗游戏
  18. 在斩获“数据金羊毛”的途中,易观造船现行,人称Argo号~
  19. 数据抓包工具(http/https)Charles,wireshark,fiddler的安装使用和区别对比 链接:https://www.365jz.com/article/24504 著作权归作者
  20. 2008 网马王网站分析

热门文章

  1. 一周面试题错题整理(一)
  2. Elasticsearch7.3文档管理
  3. 初始Android动画
  4. 创业公司如何分配股份与期权
  5. 消息队列——ActiceMQ
  6. 3dmax中布尔命令的方法
  7. 解决Arduino DUE的程序必需Reset才能启动的问题
  8. ZUI易入门Android之客户端适配9.0方案
  9. idea运行tomcat项目出现的一些问题
  10. 老板太会做生意,只做了一件事,就让这家刚开业的餐厅人气暴涨