news 2026/4/22 22:56:29

LeetCode 2024. 考试的最大困扰度【不定长滑窗】1643

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LeetCode 2024. 考试的最大困扰度【不定长滑窗】1643

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,还会用多种编程语言实现题解,涉及到通用解法时更将归纳总结出相应的算法模板。

为了方便在PC上运行调试、分享代码文件,我还建立了相关的仓库:https://github.com/memcpy0/LeetCode-Conquest。在这一仓库中,你不仅可以看到LeetCode原题链接、题解代码、题解文章链接、同类题目归纳、通用解法总结等,还可以看到原题出现频率和相关企业等重要信息。如果有其他优选题解,还可以一同分享给他人。

由于本系列文章的内容随时可能发生更新变动,欢迎关注和收藏征服LeetCode系列文章目录一文以作备忘。

一位老师正在出一场由n道判断题构成的考试,每道题的答案为 true (用'T'表示)或者 false (用'F'表示)。老师想增加学生对自己做出答案的不确定性,方法是最大化连续相同结果的题数。(也就是连续出现 true 或者连续出现 false)。

给你一个字符串answerKey,其中answerKey[i]是第i个问题的正确结果。除此以外,还给你一个整数k,表示你能进行以下操作的最多次数:

  • 每次操作中,将问题的正确答案改为'T'或者'F'(也就是将answerKey[i]改为'T'或者'F')。

请你返回在不超过k次操作的情况下,最大连续'T'或者'F'的数目。

示例 1:

输入:answerKey="TTFF",k=2输出:4

解释:我们可以将两个 ‘F’ 都变为 ‘T’ ,得到 answerKey = “TTTT” 。
总共有四个连续的 ‘T’ 。

示例 2:

输入:answerKey="TFFT",k=1输出:3

解释:我们可以将最前面的 ‘T’ 换成 ‘F’ ,得到 answerKey = “FFFT” 。
或者,我们可以将第二个 ‘T’ 换成 ‘F’ ,得到 answerKey = “TFFF” 。
两种情况下,都有三个连续的 ‘F’ 。

示例 3:

输入:answerKey="TTFTTFTT",k=1输出:5

解释:我们可以将第一个 ‘F’ 换成 ‘T’ ,得到 answerKey = “TTTTTFTT” 。
或者我们可以将第二个 ‘F’ 换成 ‘T’ ,得到 answerKey = “TTFTTTTT” 。
两种情况下,都有五个连续的 ‘T’ 。

提示:

  • n == answerKey.length
  • 1 <= n <= 5 * 10^4
  • answerKey[i]要么是'T',要么是'F'
  • 1 <= k <= n

解法 不定长滑窗(求最长但越短越容易合法)

a n s w e r K e y answerKeyanswerKey的一个最长子串,包含至多k kkT \text{T}T或者至多k kkF \text{F}F

由于子串越长,越无法满足要求,有单调性,可以用滑动窗口解决。

  1. 遍历a n s w e r K e y answerKeyanswerKey,枚举子串右端点r i g h t rightright,同时维护最小左端点l e f t leftleft以及子串中的字符个数c n t cntcnt
  2. a n s w e r K e y [ r i g h t ] answerKey[right]answerKey[right]的出现次数加一。
  3. 如果T \text{T}TF \text{F}F的出现次数都超过k kk,那么必须不断移动左端点l e f t leftleft,同时减少a n s w e r K e y [ l e f t ] answerKey[left]answerKey[left]的出现次数,直到T \text{T}TF \text{F}F的出现次数至少有一个≤ k ≤kk
  4. 循环结束后,说明子串右端点在r i g h t rightright时,对应的最小左端点为l e f t leftleft,用子串长度r i g h t − l e f t + 1 right−left+1rightleft+1更新答案的最大值。
  5. 遍历a n s w e r K e y answerKeyanswerKey结束后,返回答案。

代码实现时,由于T \text{T}TF \text{F}F的 ASCII 值除以 2 后的奇偶性不同,也就是它们二进制的次低位不同,可以改为统计二进制次低位。

classSolution{publicintmaxConsecutiveAnswers(StringanswerKey,intk){char[]s=answerKey.toCharArray();intans=0;intleft=0;int[]cnt=newint[2];for(intright=0;right<s.length;right++){cnt[s[right]>>1&1]++;while(cnt[0]>k&&cnt[1]>k){cnt[s[left]>>1&1]--;left++;}ans=Math.max(ans,right-left+1);}returnans;}}
classSolution{public:intmaxConsecutiveAnswers(string answerKey,intk){intans=0,left=0,cnt[2]{};for(intright=0;right<answerKey.length();right++){cnt[answerKey[right]>>1&1]++;while(cnt[0]>k&&cnt[1]>k){cnt[answerKey[left]>>1&1]--;left++;}ans=max(ans,right-left+1);}returnans;}};
classSolution:defmaxConsecutiveAnswers(self,answerKey:str,k:int)->int:ans=left=0cnt=defaultdict(int)forright,chinenumerate(answerKey):cnt[ch]+=1whilecnt['T']>kandcnt['F']>k:cnt[answerKey[left]]-=1left+=1ans=max(ans,right-left+1)returnans
funcmaxConsecutiveAnswers(answerKeystring,kint)(ansint){cnt:=[2]int{}left:=0forright,ch:=rangeanswerKey{cnt[ch>>1&1]++forcnt[0]>k&&cnt[1]>k{cnt[answerKey[left]>>1&1]--left++}ans=max(ans,right-left+1)}return}
implSolution{pubfnmax_consecutive_answers(answer_key:String,k:i32)->i32{lets=answer_key.as_bytes();letmutans=0;letmutleft=0;letmutcnt=[0,0];for(right,&ch)ins.iter().enumerate(){cnt[(ch>>1&1)asusize]+=1;whilecnt[0]>k&&cnt[1]>k{cnt[(s[left]>>1&1)asusize]-=1;left+=1;}ans=ans.max(right-left+1);}ansas_}}
varmaxConsecutiveAnswers=function(answerKey,k){letans=0,left=0;constcnt={'T':0,'F':0};for(letright=0;right<answerKey.length;right++){cnt[answerKey[right]]++;while(cnt['T']>k&&cnt['F']>k){cnt[answerKey[left]]--;left++}ans=Math.max(ans,right-left+1);}returnans;};// 写法2varmaxConsecutiveAnswers=function(answerKey,k){letans=0,left=0;constcnt=[0,0];for(letright=0;right<answerKey.length;right++){cnt[answerKey[right].charCodeAt(0)>>1&1]++;while(cnt[0]>k&&cnt[1]>k){cnt[answerKey[left].charCodeAt(0)>>1&1]--;left++;}ans=Math.max(ans,right-left+1);}returnans;};
#defineMAX(a,b)((b)>(a)?(b):(a))intmaxConsecutiveAnswers(char*answerKey,intk){intans=0,left=0,cnt[2]={};for(intright=0;answerKey[right];right++){cnt[answerKey[right]>>1&1]++;while(cnt[0]>k&&cnt[1]>k){cnt[answerKey[left]>>1&1]--;left++;}ans=MAX(ans,right-left+1);}returnans;}

复杂度分析:

  • 时间复杂度:O ( n ) O(n)O(n)
  • 空间复杂度:O ( n ) O(n)O(n)

思考题

把子串改为子序列该怎么做?

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/22 22:47:18

Ollama部署internlm2-chat-1.8b:支持HTTP API+OpenAI兼容接口的完整配置

Ollama部署internlm2-chat-1.8b&#xff1a;支持HTTP APIOpenAI兼容接口的完整配置 想快速体验一个功能强大、支持超长对话的轻量级中文大模型吗&#xff1f;今天我们就来聊聊如何用Ollama一键部署InternLM2-Chat-1.8B&#xff0c;并且让它不仅能通过网页聊天&#xff0c;还能…

作者头像 李华
网站建设 2026/4/22 22:43:28

Redis--基础知识点--29--Redis瓶颈

Redis 的性能极高&#xff08;单机可达 10w QPS&#xff09;&#xff0c;但在实际生产环境中&#xff0c;瓶颈通常出现在以下几个层面&#xff0c;其中 CPU 单核性能和 内存/网络延迟 最为常见。 1️⃣ CPU&#xff1a;单线程处理的“甜点与痛点” 瓶颈表现&#xff1a;单个 Re…

作者头像 李华
网站建设 2026/4/22 22:33:32

【YOLOv11】030、YOLOv11模型轻量化:MobileNet、ShuffleNet等轻量Backbone替换

深夜两点,部署现场的温度报警器又响了。 客户把工控机从i7换成了Jetson Nano,原本流畅运行的YOLOv11检测管线直接卡成PPT。散热风扇在嘶吼,帧率却只有个位数。盯着监控画面里跳动的温度曲线,我意识到:是时候给这个“胖子”模型动一场减肥手术了。 模型轻量化从来不是纸上…

作者头像 李华