[LeetCode周赛复盘] 第 89 场双周赛20221015
[LeetCode周赛复盘] 第 89 场双周赛20221015
- 一、本周周赛总结
- 二、 [Easy] 6208. 有效时间的数目
- 1. 题目描述
- 2. 思路分析
- 3. 代码实现
- 三、[Medium] 6209. 二的幂数组中查询范围内的乘积
- 1. 题目描述
- 2. 思路分析
- 3. 代码实现
- 四、[Medium] 6210. 最小化数组中的最大值
- 1. 题目描述
- 2. 思路分析
- 3. 代码实现
- 五、[Hard] 6211. 创建价值相同的连通块
- 1. 题目描述
- 2. 思路分析
- 3. 代码实现
- 六、参考链接
一、本周周赛总结
- 没打,但是补题。
- T1暴力。
- T2幂的前缀和
- T3二分答案/dp
- T4枚举答案+子树权值和
二、 [Easy] 6208. 有效时间的数目
链接: 6208. 有效时间的数目
1. 题目描述
2. 思路分析
- 我写了个DFS,卡了一会,因为dfs中判断t[i]了,实际上t会被修改,因此要判断time[i]
- 还是灵神的思路写的更快,思维量小:
- 直接暴力枚举1440种情况,即枚举时分,然后判断每位是否符合即可。
3. 代码实现
class Solution:def countTime(self, time: str) -> int:ans = set()t = list(time)def ok(t):h = int(''.join(t[:2]))m = int(''.join(t[3:]))return 0<=h<=23 and 0<=m<=59def dfs(i):if i == 5:if ok(t):ans.add(''.join(t))return if time[i] != '?':dfs(i+1)else:for j in range(10):t[i] = str(j)dfs(i+1)dfs(0)return len(ans)
三、[Medium] 6209. 二的幂数组中查询范围内的乘积
链接: 6209. 二的幂数组中查询范围内的乘积
1. 题目描述
2. 思路分析
- 第一段表述有点乱,实际是把n分成x个数,每个数都是2的幂。
- 那么显然就是n的二进制上每一位1.处理出来就是power数组了。
- 我们发现power数组长度最多是30。
- 然后就可以暴力了。
- 或者前缀积。
- 这里由于是2的幂,因此可以对幂算前缀和,最后再快速幂。
- py的话直接取模即可。
- 由于q是1e5,但实际上power最多30,询问不会超过(30+1)*30//2 ,因此可以预处理一下,询问就是O1了。
- 这里我直接写了记忆化。
3. 代码实现
MOD = 10**9 + 7
class Solution:def productQueries(self, n: int, queries: List[List[int]]) -> List[int]:p = [] for i in range(32):if n&(1<<i):p.append(i)pre = [0]+list(accumulate(p))@cachedef calc(l,r):return 2**(pre[r+1]-pre[l])%MODans = []for l,r in queries:ans.append(calc(l,r))return ans
四、[Medium] 6210. 最小化数组中的最大值
链接: 6210. 最小化数组中的最大值
1. 题目描述
2. 思路分析
灵神说了,“最小化最大值”=二分答案
- 这里我先写了一个dp,然后再尝试灵神提示的二分。
- 定义f[i]为nums中前i个数的答案。
- 初始:显然i=0时,数组就一个数,无法操作,f[0]=a[0]。
- 转移:
- nums[i] = f[i-1] ,即对nums[i]来说,无论怎么向前匀数字,不会使前边的答案变小。
- 当nums[i]<=f[i-1],当前值小,那么不需要操作即可保持f[i-1]这个答案。
- 否则尝试向前匀,能匀成什么状态呢,显然就是平均值,那么就是前缀和除以长度向上取整。
- 二分思路。
- 我们假设答案是limit,尝试进行操作,使nums中每个数都不大于limit。看看是否能成功。
- 显然这是单调的。即:limit若可以成功,那么limit+1更可以成功;limit不能成功,limit-1更不可能。
- calc函数传入limit返回01即可。代表是否成功。
- 这里calc有两种写法,最简单的是每次copy一下原数组,然后从后向前模拟,把大于limit的部分挪给前一个数。
- 常数小一点的写法是记录每次多余的部分,最后到nums[i]判断是否还有多余的部分。
3. 代码实现
dp
class Solution:def minimizeArrayValue(self, nums: List[int]) -> int:n = len(nums)pre = list(accumulate(nums))f = [0]*n f[0] = nums[0]for i in range(1,n):f[i] = f[i-1]if nums[i]<= f[i-1]:continuef[i] = max(f[i], (pre[i]+i+1-1)//(i+1))return f[-1]
二分copy写法
class Solution:def minimizeArrayValue(self, nums: List[int]) -> int:n = len(nums)def calc(limit):p = nums[:]for i in range(n-1,0,-1):if p[i]> limit:p[i-1] += p[i] - limitreturn int(p[0] <= limit)return bisect_left(range(max(nums)+1),1,key= calc)
二分常数写法
class Solution:def minimizeArrayValue(self, nums: List[int]) -> int:n = len(nums)def calc(limit):p = 0for i in range(n-1,-1,-1):p += nums[i]if p > limit:p = p- limitelse:p = 0return int(p==0)return bisect_left(range(max(nums)+1),1,key= calc)
五、[Hard] 6211. 创建价值相同的连通块
链接: 6211. 创建价值相同的连通块
1. 题目描述
2. 思路分析
- 首先一个明显的性质,s=sum(nums),如果要把树分成权值和相同的x个连通块,那么s能整除x。
- 那么考虑枚举每个连通块的权值和i,如果能整除,那么尝试分成s//i块,删除的边数就是s//i - 1。
- 问题就剩如何尝试分成s//i块,且每块权值和是i。
- 那么按照灵神给出的计算子树权值和模板,我们试图让每个子树的价值是i。
- 显然,如果子树和超过i,不合法,可以提前返回,我们用-1标志它不合法。
- 如果子树和正好是i,那么剪掉这颗子树即可,返回0。
- 最后检查根节点所在的连通块是0即可。
def dfs(u,fa):s = nums[u]for v in g[u]:if v != fa:s += dfs(v,u)return s
3. 代码实现
class Solution:def componentValue(self, nums: List[int], edges: List[List[int]]) -> int:n = len(nums)if n == 1:return 0 if len(set(nums)) == 1:return n-1g = [[] for _ in range(n)]for u,v in edges:g[u].append(v)g[v].append(u)s = sum(nums)def dfs(u,fa):p = nums[u]for v in g[u]:if v == fa:continuez = dfs(v,u)if z == -1:return -1p += zif p>i:return -1return p%ifor i in range(max(nums),s//2+1): # 枚举每块连通块价值if s % i:continue if dfs(0,-1) == 0:return s//i -1 # 每块连通块价值是i的话,能分s//i块return 0
六、参考链接
[LeetCode周赛复盘] 第 89 场双周赛20221015相关推荐
- 【双周赛】第74场双周赛
第74场双周赛 6020. 将数组划分成相等数对 6021. 字符串中最多数目的子字符串 6022. 将数组和减半的最少操作次数 6023. 用地毯覆盖后的最少白色砖块 6020. 将数组划分成相等数 ...
- 【力扣周赛】第 354 场双周赛
文章目录 Q1:2784. 检查数组是否是好的 解法1--排序+模拟判断 解法2--哈希表计数+模拟判断 Q2:6926. 将字符串中的元音字母排序 Q3:6931. 访问数组中的位置使分数最大(线性 ...
- LeetCode 第 30 场双周赛(477/2545,前18.7%,第2次全部通过)
文章目录 1. 比赛结果 2. 题目 1. LeetCode 5177. 转变日期格式 easy 2. LeetCode 5445. 子数组和排序后的区间和 medium 3. LeetCode 54 ...
- LeetCode第45场双周赛-解题报告
LeetCode第45场双周赛-解题报告 A. 唯一元素的和 原题链接 https://leetcode-cn.com/problems/sum-of-unique-elements/ 解题思路 因为 ...
- [LeetCode周赛复盘] 第 314 场周赛20221009
[LeetCode周赛复盘] 第 314 场周赛20221009 一.本周周赛总结 二. [Easy] 6201. 找出前缀异或的原始数组 1. 题目描述 2. 思路分析 3. 代码实现 三.[Eas ...
- Leetcode 第 69 场双周赛记录
Leetcode 第 69 场双周赛记录 1.第一题 5960. 将标题首字母大写 难度:easy 给你一个字符串 title ,它由单个空格连接一个或多个单词组成,每个单词都只包含英文字母.请你按以 ...
- [LeetCode周赛复盘] 第 324 场周赛20221218
[LeetCode周赛复盘] 第 324 场周赛20221218 一.本周周赛总结 二. [Easy] 6265. 统计相似字符串对的数目 1. 题目描述 2. 思路分析 3. 代码实现 三.[Med ...
- [LeetCode周赛复盘] 第 310 场周赛20220911
[LeetCode周赛复盘] 第 310 场周赛20220911 一.本周周赛总结 二. [Easy] 6176. 出现最频繁的偶数元素 1. 题目描述 2. 思路分析 3. 代码实现 三.[Medi ...
- 20220219:力扣第72场双周赛题解
力扣第72场双周赛 题目 思路与算法 代码实现 写在最后 题目 统计数组中相等且可以被整除的数对 找到和为给定整数的三个连续整数 拆分成最多数目的偶整数之和 统计数组中好三元组数目 思路与算法 前三题 ...
最新文章
- JAVA byte[] String
- 面向对象的三大特征继承,封装和多态性
- r graphics installing package
- 1011:甲流疫情死亡率
- 给不会调用C++STL库中二分函数lower_bound,upper_bound,binary_search同学的一些话!
- 《设计模式之禅》学习笔记(五)
- 笨办法学 Linux 引言
- 结对-贪吃蛇-开发过程
- www.yaxjf.com+m.php,linux运维架构--PHP开发-零基础学习PHP视频教程
- 拒绝瞎忙,高效的学习与工作经验谈
- Delphi7中idhttp和superobject获取网页中文乱码解决办法
- word文档的尺寸和字号对照表
- 华东师范计算机模拟考试题答案,《计算机入门》模拟卷C答案-华东师范大学
- 计算机怎么样保存文件,电脑怎样保存表格文件
- 如何安装虚拟机linux
- 【森气杂谈】群晖NAS内外网磁盘映射以及quick connect设置
- 关于MOMODA的隐私权政策
- Ionic Capacitor 插件开发
- 一劳永逸解决vs编译器无法使用scanf函数
- Python爬虫框架Scrapy豌豆荚应用市场爬虫
热门文章
- 等你来杭州限“量”打卡潮流艺术展
- 八电平怎么画_2020池州主题灯饰画厂家布展安装
- 利用FME实现宗地生成界址点界址线
- 如何查看端口被占用情况
- [日推荐]『StarHub微信乐游卡』新加坡通讯、上网的最佳选择!
- python学习之基于Python的人脸识别技术学习
- MHD-HD61I 大广角72.5度 12倍光学变焦摄像头
- linux后台服务架构高性能设计之道
- maya python手册_Maya中Python普及教程.doc
- 无法启用家庭计算机共享打印机共享,win10打印机共享设置,win10家庭版无法共享打印机...