[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相关推荐

  1. 【双周赛】第74场双周赛

    第74场双周赛 6020. 将数组划分成相等数对 6021. 字符串中最多数目的子字符串 6022. 将数组和减半的最少操作次数 6023. 用地毯覆盖后的最少白色砖块 6020. 将数组划分成相等数 ...

  2. 【力扣周赛】第 354 场双周赛

    文章目录 Q1:2784. 检查数组是否是好的 解法1--排序+模拟判断 解法2--哈希表计数+模拟判断 Q2:6926. 将字符串中的元音字母排序 Q3:6931. 访问数组中的位置使分数最大(线性 ...

  3. LeetCode 第 30 场双周赛(477/2545,前18.7%,第2次全部通过)

    文章目录 1. 比赛结果 2. 题目 1. LeetCode 5177. 转变日期格式 easy 2. LeetCode 5445. 子数组和排序后的区间和 medium 3. LeetCode 54 ...

  4. LeetCode第45场双周赛-解题报告

    LeetCode第45场双周赛-解题报告 A. 唯一元素的和 原题链接 https://leetcode-cn.com/problems/sum-of-unique-elements/ 解题思路 因为 ...

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

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

  6. Leetcode 第 69 场双周赛记录

    Leetcode 第 69 场双周赛记录 1.第一题 5960. 将标题首字母大写 难度:easy 给你一个字符串 title ,它由单个空格连接一个或多个单词组成,每个单词都只包含英文字母.请你按以 ...

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

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

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

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

  9. 20220219:力扣第72场双周赛题解

    力扣第72场双周赛 题目 思路与算法 代码实现 写在最后 题目 统计数组中相等且可以被整除的数对 找到和为给定整数的三个连续整数 拆分成最多数目的偶整数之和 统计数组中好三元组数目 思路与算法 前三题 ...

最新文章

  1. JAVA byte[] String
  2. 面向对象的三大特征继承,封装和多态性
  3. r graphics installing package
  4. 1011:甲流疫情死亡率
  5. 给不会调用C++STL库中二分函数lower_bound,upper_bound,binary_search同学的一些话!
  6. 《设计模式之禅》学习笔记(五)
  7. 笨办法学 Linux 引言
  8. 结对-贪吃蛇-开发过程
  9. www.yaxjf.com+m.php,linux运维架构--PHP开发-零基础学习PHP视频教程
  10. 拒绝瞎忙,高效的学习与工作经验谈
  11. Delphi7中idhttp和superobject获取网页中文乱码解决办法
  12. word文档的尺寸和字号对照表
  13. 华东师范计算机模拟考试题答案,《计算机入门》模拟卷C答案-华东师范大学
  14. 计算机怎么样保存文件,电脑怎样保存表格文件
  15. 如何安装虚拟机linux
  16. 【森气杂谈】群晖NAS内外网磁盘映射以及quick connect设置
  17. 关于MOMODA的隐私权政策
  18. Ionic Capacitor 插件开发
  19. 一劳永逸解决vs编译器无法使用scanf函数
  20. Python爬虫框架Scrapy豌豆荚应用市场爬虫

热门文章

  1. 等你来杭州限“量”打卡潮流艺术展
  2. 八电平怎么画_2020池州主题灯饰画厂家布展安装
  3. 利用FME实现宗地生成界址点界址线
  4. 如何查看端口被占用情况
  5. [日推荐]『StarHub微信乐游卡』新加坡通讯、上网的最佳选择!
  6. python学习之基于Python的人脸识别技术学习
  7. MHD-HD61I 大广角72.5度 12倍光学变焦摄像头
  8. linux后台服务架构高性能设计之道
  9. maya python手册_Maya中Python普及教程.doc
  10. 无法启用家庭计算机共享打印机共享,win10打印机共享设置,win10家庭版无法共享打印机...