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

  • 一、本周周赛总结
  • 二、 [Easy] 6201. 找出前缀异或的原始数组
    • 1. 题目描述
    • 2. 思路分析
    • 3. 代码实现
  • 三、[Easy] 6200. 处理用时最长的那个任务的员工
    • 1. 题目描述
    • 2. 思路分析
    • 3. 代码实现
  • 四、[Medium] 6202. 使用机器人打印字典序最小的字符串
    • 1. 题目描述
    • 2. 思路分析
    • 3. 代码实现
  • 五、[Hard] 6203. 矩阵中和能被 K 整除的路径
    • 1. 题目描述
    • 2. 思路分析
    • 3. 代码实现

一、本周周赛总结

  • 国庆补班没打,午休时VP了一下,打的也不好。
  • T4虽然是套路DP,但卡了半天,DP还是短板啊。

二、 [Easy] 6201. 找出前缀异或的原始数组

链接: 6201. 找出前缀异或的原始数组

1. 题目描述

2. 思路分析

  • 给出前缀和找原数组,那么求差分数组即可。
  • python3.10之后可以pairwise一行搞定,VP时没想那么多。

3. 代码实现

class Solution:def findArray(self, pref: List[int]) -> List[int]:n = len(pref)arr = [pref[0]]*nfor i in range(1,n):arr[i] = pref[i]^pref[i-1]return arr

三、[Easy] 6200. 处理用时最长的那个任务的员工

链接: 6200. 处理用时最长的那个任务的员工

1. 题目描述

2. 思路分析

  • 题面是真滴长!
  • 还读错一次题,幸好case没过。
  • 实际是看最长的那个任务谁干的,pairwise即可。

3. 代码实现

class Solution:def hardestWorker(self, n: int, logs: List[List[int]]) -> int:        s = 0mx = -1ans = inffor i,lv in logs:t= lv - sif t > mx:ans = imx = tif t == mx:ans = min(ans,i)s = lvreturn ans

四、[Medium] 6202. 使用机器人打印字典序最小的字符串

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

1. 题目描述

2. 思路分析

  • 本题是经典贪心:求字典序最小的出栈序列。
  • 用贪心栈解决。
  • 顺序遍历原数据,对每个字符压栈。
  • 考虑栈顶字符c在后续的情况,设后续串中最小字符是m,那么有两种情况:
    1. 如果c>m,那么显然优先出m才是最优解。这样的话继续向后遍历到m出m,途径的字符全部压栈即可。
    1. 如果c<=m,那么可以直接出c,因为后续不会有更优解。
  • 以上对栈顶的操作应该while做。

  • 如何判断后续元素的最小值呢。
  • 正常操作是DP预处理每个位置后续的最小值,倒序dp,f[i] = min(s[i],f[i+1]) ,初始f[n] = 'z’即可。
  • 这样f[i]代表s[i:]中的最小值,求第i个位置之后的最小值就是f[i+1].
  • 这题由于值域比较小26,VP时也没多想,直接用Counter+双指针做了。
  • Counter的好处是省一点内存,坏处是比较麻烦,因为要字符转下标;而且双指针比较烧脑。

3. 代码实现

dp预处理

class Solution:def robotWithString(self, s: str) -> str:n = len(s)f = ['z']*(n+1)  # 每个字符后边最小的字符是谁for i in range(n-1,-1,-1):f[i]  = min(s[i],f[i+1])ans = []      st = []for i,c in enumerate(s):st.append(c)while st and st[-1] <= f[i+1]:ans.append(st.pop())ans.extend(st[::-1])return ''.join(ans)

counter预处理

class Solution:def robotWithString(self, s: str) -> str:cnt = [0]*26for c in s:cnt[ord(c)-ord('a')] += 1ans = []j = 0st = []for c in s:while j < 26 and cnt[j]==0:j+=1while st and ord(st[-1]) <= j+ord('a'):ans.append(st.pop())if ord(c) == j + ord('a'):ans.append(c)else:st.append(c)cnt[ord(c)-ord('a')] -= 1j = 0ans.extend(st[::-1])return ''.join(ans)

五、[Hard] 6203. 矩阵中和能被 K 整除的路径

链接: 6203. 矩阵中和能被 K 整除的路径

1. 题目描述

2. 思路分析

  • 压轴了一道套路DP,在事先读过题面的情况下,还是卡了20min,感觉自己真的蠢。
  • 读错一次题,幸好case没过。。题目要求了起点终点,因此路径数直接转移即可,没有中途点作为终点起点的情况。
  • 看到m*n<=5e4本来觉得记忆化搜索过不了的,于是还是写了代码较多的DP,没想到力扣对py还是很友好,加个cache_clear就能过。下次写记忆化建议无脑加clear(或看看数据量)。
  • 这里提一嘴,由于py的默认栈深限制是1000,对于这题显然过不了,力扣应该是修改了栈深参数,我通过print(sys.getrecursionlimit())在本题验证了一下,结果是550000。
  • 在别的平台上,如果手动开到这么大,应该会爆MLE,力扣400兆左右的内存是允许的。。但无脑cache显然也是MLE了,在lccn上显示的是超时实际是个bug,同样的代码在lcus上显示的是MLE。

  • 回到这题,每个位置显然只能从左或者上转移而来,这题要对k整除,也就是对k取模是0,那么如果终点是x,显然转移来的位置(左和上)需要的当前状态是(k-x)%x。
  • 因此我们的状态应该占个维度,即当前和对k取模都能是多少,实际本题路径坐标已经有两维了,因此总共是三维。
  • 转移:f[i][j][v] = f[i-1][j][(v-grid[i][j])%k) +f[i][j-1][(v-grid[i][j])%k)
  • 初始:f[0][0][grid[0][0]%k] = 1,其他是0
  • ans:f[m-1][n-1][0]

3. 代码实现

记忆化搜索+cache_clear

class Solution:def numberOfPaths(self, grid: List[List[int]], k: int) -> int:MOD = 10**9+7m,n = len(grid),len(grid[0])@cachedef f(i,j,mod):if i == j == 0:return int(grid[0][0]%k == mod%k)ans = 0if i:ans += f(i-1,j,(mod-grid[i][j])%k)if j :ans += f(i,j-1,(mod-grid[i][j])%k)return ans%MODans = f(m-1,n-1,k)f.cache_clear()# print(sys.getrecursionlimit())return ans

滚动优化DP

class Solution:def numberOfPaths(self, grid: List[List[int]], k: int) -> int:MOD = 10**9+7m,n = len(grid),len(grid[0])f = [[0]*k for _ in range(n)] f[0][grid[0][0]%k] = 1for i in range(m):g = ff = [[0]*k for _ in range(n)] for j in range(n):if i == j == 0:f[0][grid[0][0]%k]=1continuefor x in range(k):if i:f[j][x] += g[j][(x-grid[i][j])%k]if j:f[j][x] += f[j-1][(x-grid[i][j])%k]f[j][x]%=MOD                                   return f[-1][0]%MOD

朴素DP

class Solution:def numberOfPaths(self, grid: List[List[int]], k: int) -> int:MOD = 10**9+7m,n = len(grid),len(grid[0])f = [[[0]*k for _ in range(n)] for _ in range(m)]f[0][0][grid[0][0]%k] = 1for i in range(m):for j in range(n):if i == j == 0:continuefor x in range(k):if 0<=i-1<m and 0<=j<n:f[i][j][x] += f[i-1][j][(x-grid[i][j])%k]if 0<=i<m and 0<=j-1<n:f[i][j][x] += f[i][j-1][(x-grid[i][j])%k]f[i][j][x]%=MODreturn f[-1][-1][0]%MOD

[LeetCode周赛复盘] 第 314 场周赛20221009相关推荐

  1. [LeetCode周赛复盘] 第 324 场周赛20221218

    [LeetCode周赛复盘] 第 324 场周赛20221218 一.本周周赛总结 二. [Easy] 6265. 统计相似字符串对的数目 1. 题目描述 2. 思路分析 3. 代码实现 三.[Med ...

  2. [LeetCode周赛复盘] 第 310 场周赛20220911

    [LeetCode周赛复盘] 第 310 场周赛20220911 一.本周周赛总结 二. [Easy] 6176. 出现最频繁的偶数元素 1. 题目描述 2. 思路分析 3. 代码实现 三.[Medi ...

  3. [acwing周赛复盘] 第 91 场周赛20230218

    [acwing周赛复盘] 第 91 场周赛20230218 一.本周周赛总结 二. 4861. 构造数列 1. 题目描述 2. 思路分析 3. 代码实现 三.4862. 浇花 1. 题目描述 2. 思 ...

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

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

  5. [LeetCode周赛复盘] 第 89 场双周赛20221015

    [LeetCode周赛复盘] 第 89 场双周赛20221015 一.本周周赛总结 二. [Easy] 6208. 有效时间的数目 1. 题目描述 2. 思路分析 3. 代码实现 三.[Medium] ...

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

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

  7. 【力扣周赛】第349场周赛

    [力扣周赛]第349场周赛 6470. 既不是最小值也不是最大值 题目描述 解题思路 6465. 执行子串操作后的字典序最小字符串 题目描述 解题思路 6449. 收集巧克力 题目描述 解题思路 64 ...

  8. 【力扣周赛】第342场周赛

    [力扣周赛]第342场周赛 6387:计算列车到站时间 题目描述 解题思路 6391:倍数求和 题目描述 解题思路 6390:滑动子数组的美丽值 题目描述 解题思路 6392:使数组所有元素变成1的最 ...

  9. 【力扣周赛】第343场周赛

    [力扣周赛]第343场周赛 2660:保龄球游戏的获胜者 题目描述 解题思路 2661:找出叠涂元素 题目描述 解题思路 2660:保龄球游戏的获胜者 题目描述 描述:给你两个下标从 0 开始的整数数 ...

最新文章

  1. hihocoder Tower Defense Game(树上贪心)
  2. 找出有序数组X和Y中所有元素的中位数(X,Y分别含n个元素)(算法导论第三版9.3-8)
  3. 关于神经网络权重初始值的设置的研究
  4. java中Collections常用方法总结(包括sort,copy,reverse等)
  5. Java使用OpenCV3.2实现视频读取与播放
  6. 《Java从小白到大牛精简版》之第6章 运算符(上)
  7. 简易图解N合1集成安装光盘制作教程二
  8. VC中调用 Excel 的总结
  9. CTF PWN之heap入门 unlink
  10. 32位和64位系统对于程序员的影响
  11. 阿里云天池龙珠计划 sql篇---stack06
  12. JAVA后端面经总结——应用类
  13. Segger RTT深度使用说明-移植-Jlink rtt viewer显示-输出到Secure CRT
  14. 【QT】QByteArray的使用
  15. CSS+HTML实现学成在线静态页面
  16. 从头开始敲代码之《从BaseApplication/Activity开始(五)》(自定义控件,实现点击/滑动翻页)
  17. 语音交互设计探究——以车载场景为例
  18. Redis压测工具(redis-benchmark)
  19. 钱诚11.3黄金投资分析、原油实时涨跌布局、白银最新指导
  20. PID调节C语言解析

热门文章

  1. 微信小程序登录及请求封装
  2. Android Drawable (可绘制图像)
  3. hdu 3003-Pupu-快速幂取模
  4. 销售开发新客户的渠道
  5. HTML(3):IE浏览器编程 - vcmute的专栏 - CSDNBlog
  6. Loading 加载数据一直转圈圈停不下来怎么办,看这个一学就会
  7. 自己建服务器 语音盒子_自建语音服务器
  8. Task01:数据载入及初步观察
  9. kmeans聚类算法python
  10. matlab粒子群加约束条件_matlab粒子群编程,等式约束如何加入