[LeetCode周赛复盘] 第 325 场周赛20221225

  • 一、本周周赛总结
  • 二、 [Easy] 6269. 到目标字符串的最短距离
    • 1. 题目描述
    • 2. 思路分析
    • 3. 代码实现
  • 三、[Medium] 6270. 每种字符至少取 K 个
    • 1. 题目描述
    • 2. 思路分析
    • 3. 代码实现
  • 四、[Medium] 6271. 礼盒的最大甜蜜度
    • 1. 题目描述
    • 2. 思路分析
    • 3. 代码实现
  • 五、[Hard] 6272. 好分区的数目
    • 1. 题目描述
    • 2. 思路分析
    • 3. 代码实现
  • 六、参考链接

一、本周周赛总结

  • T1暴力。
  • T2滑窗。
  • T3二分。
  • T4背包。

二、 [Easy] 6269. 到目标字符串的最短距离

链接: 6269. 到目标字符串的最短距离

1. 题目描述

2. 思路分析

两种遍历,找最短的写。

3. 代码实现

class Solution:def closetTarget(self, words: List[str], target: str, startIndex: int) -> int:n = len(words)if target not in words:return -1# a = 0# for i in range(n):#     if words[(i+startIndex)%n] == target:#         a = i#         break# b = 0# for i in range(n):#     if words[(startIndex-i)%n] == target:#         b = i#         break# return min(a,b)ans = nfor i,w in enumerate(words):if w == target:ans = min(ans,(i-startIndex)%n,(startIndex-i)%n)return ans

三、[Medium] 6270. 每种字符至少取 K 个

链接: 6270. 每种字符至少取 K 个

1. 题目描述

2. 思路分析

  • 把s翻倍,然后在中间位置滑窗,即有效的答案窗口必须包含n-1或者n的位置。

  • 灵神的思路是,先从后缀找到最小合法串,然后尝试增加前缀,减小后缀。

  • 还有一种滑窗思路,从中间去掉最长一段,使剩下的abc个数满足题意;即中间段的abc个数需要<=原数-k

3. 代码实现

翻倍滑窗

class Solution:def takeCharacters(self, s: str, k: int) -> int:c = Counter(s)if any(c[x]<k for x in 'abc'):return -1if k == 0:return 0ss = s + sn = len(s)c = Counter()q = deque()ans = inffor r,v in enumerate(ss):c[v] += 1q.append(r)while q and c[ss[q[0]]] > k:c[ss[q.popleft()]] -= 1# print(c,q)if len(q)<ans and len(q)>=3*k and q[0]<=n and q[-1]>=n-1 and  c['a']>=k and c['b']>=k and c['c']>=k:ans = len(q)return ans)

前后双指针

class Solution:def takeCharacters(self, s: str, k: int) -> int:c = Counter(s)if any(c[x]<k for x in 'abc'):return -1if k == 0:return 0j = n = len(s)c = Counter()        q = deque()while c['a']<k or c['b']<k or c['c']<k:            j -= 1q.appendleft(j)c[s[j]] += 1ans = len(q)for i,v in enumerate(s):c[v] += 1while q and c[s[q[0]]] > k:c[s[q.popleft()]] -= 1# print(c,q)ans = min(ans,len(q)+i+1)return ans

四、[Medium] 6271. 礼盒的最大甜蜜度

链接: 6271. 礼盒的最大甜蜜度

1. 题目描述

2. 思路分析

  • 最小值最大化,又是二分。
  • ok(x)代表任意差不小于x时,能否找出k类糖果;显然x越小,越能满足。单调的。
  • ok函数内部贪心,由于要尽可能多去多选,因此可以必选最小的,然后向后尽可能取最近的满足超过x的糖果。计数能否满足k个即可。

3. 代码实现

class Solution:def maximumTastiness(self, price: List[int], k: int) -> int:n = len(price)mx = max(price) - min(price)if k == 2:return mxprice.sort()def ok(x):# 二分判断模板,越小的x满足要求,则yes=0 no=1,答案应是最后一个0的位置即bisect_left(range(xxx),1,key=ok)-1yes,no = 0,1c = 1  # 计数pre = price[0]for p in price[1:]:if p-pre>=x:c += 1pre = pif c>=k:return yes  # 足够了return noreturn bisect_left(range(mx+1),1,key=ok)-1

五、[Hard] 6272. 好分区的数目

链接: 6272. 好分区的数目

1. 题目描述

2. 思路分析

  • 这题目一看像背包,但又发现要>=k的数量,不好写。
  • 因此反着算,求<k的方案数,再计算总体方案数,相减即可。
  • 比赛时由于不会特判错误情况,只能最后判断大小,导致中途不能取模,很可能TLE,但是赛后造了下数据没有TLE,很怪。可能力扣的数据量还是不够极限。
  • 定义f[j]为取任意数求和为j的方案数,由于两边是对称的且不会重(提前特判了非法的重复),因此我们可以sum(f)*2来计算总的<k的方案数。

3. 代码实现

MOD = 10**9 + 7
class Solution:def countPartitions(self, nums: List[int], k: int) -> int:        # 特判很关键,代表任意分组都无法让两边同时满足;这样就会剔除背包计算出来的一边小于k,但另一边也小于k的重复数据# 即:背包的结果一定是一边小于k,而剩下的不小于k,对称无重复,可以放心乘2if k*2>sum(nums):  return 0f = [0]*kf[0] = 1for x in nums:for j in range(k-1,x-1,-1):f[j] = (f[j] + f[j-x]) % MODreturn (pow(2, len(nums), MOD) - sum(f)*2%MOD) %MOD# # # #以下是错误答案,由于不会上边那个特判,因此只能最后判断大小,导致中途不敢取模,大数据必TLE# n = len(nums)# f = [0]*k# f[0] = 1# for x in nums:#     for j in range(k-1,x-1,-1):#         f[j] += f[j-x]# print(n)# a = 2**n# b = sum(f)*2# if a <= b:#     return 0# return (2**n - sum(f)*2)%MOD

六、参考链接

[LeetCode周赛复盘] 第 325 场周赛20221225相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    [力扣周赛]第345场周赛 6430: 找出转圈游戏输家 题目描述 解题思路 6431: 相邻值的按位异或 题目描述 解题思路 6433: 矩阵中移动的最大次数 题目描述 解题思路 6432: 统计完 ...

  10. 【力扣周赛】第340场周赛

    [力扣周赛]第340场周赛 6361:对角线上的质数 题目描述 解题思路 6360:等值距离和 题目描述 解题思路 6361:对角线上的质数 题目描述 描述:给你一个下标从 0 开始的二维整数数组 n ...

最新文章

  1. 关于学习的一则小故事
  2. Russell大师课+大厂专家倾授+5小时黑客松,上海临港人工智能开发者大会倒计时5天...
  3. K-均值聚类算法对未标注数据分组(1)
  4. linux 命令行使用技巧linux 下的文件管理
  5. 使用wxWidgets编程——第一步
  6. 智能会议系统(23)---移动端视频通话开源软件比较
  7. 清楚了解TCP三次握手和四次挥手的过程中各标志的含义
  8. 基于WordNet的英文同义词、近义词相似度评估及代码实现
  9. CTEX加中英文摘要
  10. 【科研】科研绘图作图画图
  11. Java获取IP归属地
  12. mysql数据库之基本函数,列属性,数据库管理
  13. “立字据,你们这群混蛋!”
  14. FlashVml2.0(WEB上的PhotoShop+Flash、VML最强开发工具)[推荐]
  15. 人人都是产品经理之用Axure制作微信主页原型图
  16. 树莓派mqtt连接onenet平台实现消息订阅与发布
  17. UE5 官方案例Lyra 全特性详解 14.背包系统Inventory System3
  18. 使用proxmark3修改UID卡的0号扇区
  19. java webclient_Spring Boot(14)——使用WebClient
  20. Python中如何实现im2col和col2im函数(sliding类型)

热门文章

  1. [培训-无线通信基础-5]:数字调制解调(线性调制、非线性调制)
  2. 中国家用燃气报警器市场现状调研与投资战略分析报告2022年版
  3. jetson-nano多目标追踪过线计数
  4. 微信小程序云开发Error: errCode: -404011 cloud function execution error -501003 exceed request limit
  5. 2019年8月13暑假训练
  6. 在Linux服务器上部署BERT预训练模型——展示了如何在Linux服务器上使用Docker容器部署BERT预
  7. java 文件类File 文本I/O
  8. docker部署发布工具jenkins
  9. NYOJ 506题 洗澡
  10. springboot项目东方通TongWeb改造以及部署