🌈【LeetCode 2024.考试的最大困扰度 】- JavaScript(双指针+滑动窗口)

145 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情


说明:文章部分内容及图片出自网络,如有侵权请与我本人联系(主页有公众号:小攻城狮学前端)

作者:小只前端攻城狮、 主页:小只前端攻城狮的主页、 来源:掘金

GitHub:P-J27、 CSDN:PJ想做前端攻城狮

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


【LeetCode 2024.考试的最大困扰度 】- JavaScript(双指针+滑动窗口)

题意描述

一位老师正在出一场由 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' 。

思路分析:

刚一开始思路以为是动态规划,结果dp半天都没dp出来,然后写了个dfs然后超时😭。过了半天才发现原来是个贪心滑窗。当场吃...

滑动窗口

使用滑动窗口的思路,遍历字符串的同时分别记录T和F的数量来更新滑动窗口的大小。

function maxConsecutiveAnswers(answerKey: string, k: number): number {
    let countF = 0;
    let countT = 0;
    let left = 0;
    let right = 0;
    let max = 0;
    while (right < answerKey.length) {
        answerKey[right] === 'T' ? countT++ : countF++;
        right++;
        while (countF > k && countT > k) {
            answerKey[left] === 'T' ? countT-- : countF--;
            left++;
        }
        max = Math.max(max, countF + countT);
    }
    return max;
};

双指针

核心思想:我们要找出可以修改出来最长的连续字符串,即找出里面T和F的数量均不能超过k的字符串。那我们发现可以通过记录left,当向右边移动时,如果T或者F超出了k,那就移动left向右,直到不超出k即可,通过中间量来维护最大值,即我们所求。

var maxConsecutiveAnswers = function(answerKey, k) {
    let res = 0;
    let left = 0;
    const tfMap = {
        T: 0,
        F: 0,
    };
    for (let i = 0; i < answerKey.length; i++) {
        tfMap[answerKey[i]]++;
        while (Math.min(tfMap.T, tfMap.F) > k) {
            tfMap[answerKey[left]]--;
            left++;
        }
        res = Math.max(i - left + 1, res);
    }
    return res;
};

感谢阅读,希望能对你有所帮助,文章若有错误或者侵权,可以在评论区留言或在我的主页添加公众号联系我。

写作不易,如果觉得不错,可以「点赞」+「评论」 谢谢支持❤