[LeetCode周赛复盘] 第 324 场周赛20221218
[LeetCode周赛复盘] 第 324 场周赛20221218
- 一、本周周赛总结
- 二、 [Easy] 6265. 统计相似字符串对的数目
- 1. 题目描述
- 2. 思路分析
- 3. 代码实现
- 三、[Medium] 6266. 使用质因数之和替换后可以取到的最小值
- 1. 题目描述
- 2. 思路分析
- 3. 代码实现
- 四、[Medium] 6267. 添加边使所有节点度数都为偶数
- 1. 题目描述
- 2. 思路分析
- 3. 代码实现
- 五、[Hard] 6268. 查询树中环的长度
- 1. 题目描述
- 2. 思路分析
- 3. 代码实现
- 六、参考链接
一、本周周赛总结
- 这周考的还行,4道题多多少少都要点数学。
- T1 计数+等差数列求和。
- T2 数论模板,由于质数数组开的不够RE一次。
- T3 分类讨论。
- T4 lca。
二、 [Easy] 6265. 统计相似字符串对的数目
链接: 6265. 统计相似字符串对的数目
1. 题目描述
2. 思路分析
- 题目只要求字符相同,不要求数量,因此set去重,然后排序来归类。
- 另外,灵神写法是状压,把26个字符压成26位表示出没出现即可。
3. 代码实现
class Solution:def similarPairs(self, words: List[str]) -> int:c = Counter()for w in words:c[''.join(sorted(set(w)))] += 1ans = 0for v in c.values():ans += v*(v-1)//2return ans
三、[Medium] 6266. 使用质因数之和替换后可以取到的最小值
链接: 6266. 使用质因数之和替换后可以取到的最小值
1. 题目描述
2. 思路分析
幸好之前写了个取质因数的模板,直接复制过来按题意要求模拟。
- 理论上时间复杂度是开方n,注意记忆化写外边。
- 用欧拉筛预处理质数,然后对每个x分治质因数。
3. 代码实现
直接找质因数
,看似2重循环也没判断质数,实际上由于因数从2开始变大,且每次把每个数除完,因此不会取到合数(会实现把这个合数的因子取完),且复杂度就是sqrt(n)。
class Solution:def smallestValue(self, n: int) -> int:while True:x, s, i = n, 0, 2while i * i <= x:while x % i == 0:s += ix //= ii += 1if x > 1: s += xif s == n: return nn = s
def tag_primes_euler(n): # 返回一个长度n+1的数组p,如果i是质数则p[i]=1否则p[i]=0primes = [1]*(n+1)primes[0] = primes[1] = 0 # 0和1不是质数ps = [] # 记质数for i in range(2,n+1):if primes[i]:ps.append(i)for j in ps:if j*i>n:breakprimes[j*i] = 0if i%j == 0:break# print(ps)return primesprimes = tag_primes_euler(10**5+5)@cache
def get_prime_reasons(x):if x == 1:return Counter()if primes[x]:return Counter([x])for i in range(2,int(x**0.5)+1):if x % i == 0:return get_prime_reasons(i) + get_prime_reasons(x//i) class Solution:def smallestValue(self, n: int) -> int:while n :c = get_prime_reasons(n)s = 0 for k,v in c.items():s += k*vif s == n:return s n = sreturn n
四、[Medium] 6267. 添加边使所有节点度数都为偶数
链接: 6267. 添加边使所有节点度数都为偶数
1. 题目描述
2. 思路分析
- 直接分类讨论,注意题目提示中最后两个条件。即原图中没有自环和重边,且要求添加后的图也没有。
- 我们建图后统计原图中的点,有几个奇数度的点x,几个偶数度的点y,把它们分出来。
- 显然如果没有奇数(x==0),则无需添加,返回True;如果x>=5,因为一条边最多影响2个点,因此仅用2条边无论如何也搞不定,return False.
- 如果x==1,那么这个仅有的点,连哪个点都不行,会使另外一个偶点的度+1变成奇数。return False。
- 同理如果x==3,至少要用一条边改变2个点,剩下一个点变成上一种情况。return False。
- 如果x==2,设这俩点是a,b
- 若ab不是本来就连着,就可以用一条边连起来,把它俩变偶度,且不影响其他边,return True。
- 若ab本来就是连着呢,考虑找一个原本的偶度点c,且不连接a,b,把a,b都连c,return True。
- 如果x==4,那么用两条边只能两两相连,找出任意匹配方式,即匹配的两点不互相连接即可。
3. 代码实现
class Solution:def isPossible(self, n: int, edges: List[List[int]]) -> bool:g = [set() for _ in range(n)]for u,v in edges:u-=1v-=1g[u].add(v)g[v].add(u)ji,ou = [],[]for u in range(n):if len(g[u]) & 1:ji.append(u)else:ou.append(u)if len(ji)>=5:return Falseif not ji :return Trueif len(ji)&1:return Falseif len(ji) == 2:a,b = jiif a not in g[b]:return Truefor u in ou:if u not in g[a] and u not in g[b]:return Truereturn Falseif len(ji) == 4:a,b,c,d = jiif a not in g[b] and c not in g[d]:return Trueif a not in g[c] and b not in g[d]:return Trueif a not in g[d] and c not in g[b]:return Truereturn False
五、[Hard] 6268. 查询树中环的长度
链接: 6268. 查询树中环的长度
1. 题目描述
2. 思路分析
- 比赛时看到lca吓一跳,因为确实没学会树上倍增,然后仔细看数据范围原来是完全二叉树:
- 那么树高不会超过30,每个询问分开向根节点走即可。
- 由于是完全二叉树,找父节点很方便;参考线段树的数组表示。
- 那么做法就是两个节点都向上走,找到第一个相同的祖宗节点,然后计算总距离+1即可。
- 实现时,令a<b,这样好考虑一些。
- 正经LCA做法,每次让更深的那个向上搜索。
3. 代码实现
正经LCA
class Solution:def cycleLengthQueries(self, n: int, queries: List[List[int]]) -> List[int]:def calc(a,b): ans = 1while a!=b:if a > b:a,b = b,a ans += 1b //= 2return ansreturn [calc(a,b) for a,b in queries]
class Solution:def cycleLengthQueries(self, n: int, queries: List[List[int]]) -> List[int]:m = len(queries)ans = []def calc(a,b):if a > b:a,b = b,as,p = set(),[]while a:s.add(a)a //= 2while b:if b in s:return len(p) + len([a for a in s if a>b])+1p.append(b)b //= 2for a,b in queries:ans.append(calc(a,b))return ans
两个点同时走
class Solution:def cycleLengthQueries(self, n: int, queries: List[List[int]]) -> List[int]:def calc(a,b): if a > b:a,b = b,as,p = set(),0 while b:if a:s.add(a)a //= 2if b in s:return p + len([a for a in s if a>b])+1p += 1b //= 2return preturn [calc(a,b) for a,b in queries]
六、参考链接
[LeetCode周赛复盘] 第 324 场周赛20221218相关推荐
- [LeetCode周赛复盘] 第 314 场周赛20221009
[LeetCode周赛复盘] 第 314 场周赛20221009 一.本周周赛总结 二. [Easy] 6201. 找出前缀异或的原始数组 1. 题目描述 2. 思路分析 3. 代码实现 三.[Eas ...
- [LeetCode周赛复盘] 第 310 场周赛20220911
[LeetCode周赛复盘] 第 310 场周赛20220911 一.本周周赛总结 二. [Easy] 6176. 出现最频繁的偶数元素 1. 题目描述 2. 思路分析 3. 代码实现 三.[Medi ...
- [acwing周赛复盘] 第 91 场周赛20230218
[acwing周赛复盘] 第 91 场周赛20230218 一.本周周赛总结 二. 4861. 构造数列 1. 题目描述 2. 思路分析 3. 代码实现 三.4862. 浇花 1. 题目描述 2. 思 ...
- [LeetCode周赛复盘] 第 89 场双周赛20221015
[LeetCode周赛复盘] 第 89 场双周赛20221015 一.本周周赛总结 二. [Easy] 6208. 有效时间的数目 1. 题目描述 2. 思路分析 3. 代码实现 三.[Medium] ...
- 【力扣周赛】第349场周赛
[力扣周赛]第349场周赛 6470. 既不是最小值也不是最大值 题目描述 解题思路 6465. 执行子串操作后的字典序最小字符串 题目描述 解题思路 6449. 收集巧克力 题目描述 解题思路 64 ...
- 【力扣周赛】第342场周赛
[力扣周赛]第342场周赛 6387:计算列车到站时间 题目描述 解题思路 6391:倍数求和 题目描述 解题思路 6390:滑动子数组的美丽值 题目描述 解题思路 6392:使数组所有元素变成1的最 ...
- 【力扣周赛】第343场周赛
[力扣周赛]第343场周赛 2660:保龄球游戏的获胜者 题目描述 解题思路 2661:找出叠涂元素 题目描述 解题思路 2660:保龄球游戏的获胜者 题目描述 描述:给你两个下标从 0 开始的整数数 ...
- 【力扣周赛】第345场周赛
[力扣周赛]第345场周赛 6430: 找出转圈游戏输家 题目描述 解题思路 6431: 相邻值的按位异或 题目描述 解题思路 6433: 矩阵中移动的最大次数 题目描述 解题思路 6432: 统计完 ...
- 【力扣周赛】第340场周赛
[力扣周赛]第340场周赛 6361:对角线上的质数 题目描述 解题思路 6360:等值距离和 题目描述 解题思路 6361:对角线上的质数 题目描述 描述:给你一个下标从 0 开始的二维整数数组 n ...
最新文章
- 什么是CUDA编程 统一计算架构
- VirtualBox——在Win7的HOST上安装配置虚拟机CentOS7
- zzuli oj 1167逆转数(指针专题)
- memcached服务器搭建(RedHat5)
- 点云格式解读 PCD
- 解决IE正常模式与兼容性模式的办法
- phpword中设置间距_管道支、吊架的安装间距规范上如何规定?
- c++primer 5th第15章基础、课后习题自己解析、心得体会等
- Google, 请不要离开我们!
- 小度智能音箱维修点_小度智能音箱无法唤醒怎么办
- web文件服务器 开源,10个开源的基于WEB的文件管理器
- 老旧小区安防升级改造有机遇也有难度
- html中展开的小箭头,HTML5 移动网页应用中的展开式标签(带上下指示箭头)
- 0017-Spark的HistoryServer不能查看到所有历史作业分析
- 计算机的各种配件知识,菜鸟必读:DIY装机需要知道的一些配件小知识
- RGB在线取色器,可视化三通道颜色
- 计算机在未来对人类生活的影响,日常生活中计算机技术的发展对我们的影响
- 如何将计算机恢复到桌面快捷方式,怎样还原电脑系统默认的Windows快捷方式及其图标呀?...
- C语言 大赛现场统分
- echarts 饼图标签过多导致显示不全