一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情。
说明:文章部分内容及图片出自网络,如有侵权请与我本人联系(主页有公众号:小攻城狮学前端)
作者:小只前端攻城狮、 主页:小只前端攻城狮的主页、 来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
【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;
};
感谢阅读,希望能对你有所帮助,文章若有错误或者侵权,可以在评论区留言或在我的主页添加公众号联系我。
写作不易,如果觉得不错,可以「点赞」+「评论」 谢谢支持❤