Leetcode笔记 每日一题 2024. 考试的最大困扰度 (22.03.29)

Leetcode笔记 每日一题 2024. 考试的最大困扰度 (22.03.29)

Leetcode 每日一题 2024. 考试的最大困扰度 (22.03.29)

题目

一位老师正在出一场由 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 * 104
  • answerKey[i] 要么是 ‘T’ ,要么是 ‘F’
  • 1 <= k <= n

解题思路

思路:滑动窗口 参考:基本原理和实践

  1. 题目中k表示对字符串 answerKey 进行修改的最大可操作数,即将’F’改成’T’或’T’改成’F’的最大改动数,也可以认为是窗口里(‘FFF…F’)包含’T’或者(‘TT…T’)'F’的个数不超最大改动数k
  2. 所以利用 t_sum、f_sum表示窗口范围内T、F的数量,min(T_num,F_num)为范围内数量较少改动数量。当min(t_sum , f_sum) > k 要判断左指针answerKey[left]的值是否等 ‘T’或者’F’:
  • answerKey[left] == 'T'时,t_sum -= 1, left += 1,即左指针向后移动一位,反之 f_sum -= 1,left +=1
  1. 最后当min(t_sum , f_sum) = k 时,输出左右指针的位置差right - left +1

Python代码

class Solution:
    def maxConsecutiveAnswers(self, answerKey: str, k: int) -> int:
        t_sum , f_sum = 0,0 # t_sum、f_sum表示范围内T、F的数量
        left = 0 # 左指针
        for right , c in enumerate(answerKey): # 遍历字符串
            t_sum += c == 'T'
            f_sum += c == 'F'
            if min(t_sum , f_sum) > k: # min(T_num,F_num)为范围内数量较少的答案,即改动数量
                if answerKey[left] == 'T':
                    t_sum -= 1
                else:
                    f_sum -= 1
                left += 1
        return right - left+1 # 最后算出最大连续数目

其它解题思路

作者:宫水三叶 《【宫水三叶】滑动窗口运用题》 (Java)
作者:Benhao 《 [Python/Java/JavaScript/Go] 双指针滑动窗口 》(Python)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值