LeetCode 2024、考试的最大困扰度
LeetCode 2024、考试的最大困扰度
一、题目描述
一位老师正在出一场由 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
二、题目解析
三、参考代码
Python
# 题目:LC2024. 考试的最大困扰度
# 难度:中等
# 作者:许老师-闭着眼睛学数理化
# 算法:不定滑窗
# 代码看不懂的地方,请直接在群上提问
# 本质上是求【至多包含k个T或k个F的滑窗的最大长度】
# 故用两个变量 num_T, num_F 维护滑窗过程
class Solution:
def maxConsecutiveAnswers(self, answerKey: str, k: int) -> int:
num_T, num_F = 0, 0
ans, left = 0, 0
for right, ch in enumerate(answerKey):
# A1
if ch == "T":
num_T += 1
else:
num_F += 1
# A2
while(min(num_T, num_F) > k):
if answerKey[left] == "T":
num_T = num_T-1
else:
num_F = num_F-1
left += 1
# A3
ans = max(ans, right-left+1)
return ans
Java
public class Solution {
public int maxConsecutiveAnswers(String answerKey, int k) {
int num_T = 0, num_F = 0;
int ans = 0, left = 0;
for (int right = 0; right < answerKey.length(); right++) {
char ch = answerKey.charAt(right);
// A1
if (ch == 'T') {
num_T++;
} else {
num_F++;
}
// A2
while (Math.min(num_T, num_F) > k) {
if (answerKey.charAt(left) == 'T') {
num_T--;
} else {
num_F--;
}
left++;
}
// A3
ans = Math.max(ans, right - left + 1);
}
return ans;
}
}
C++
class Solution {
public:
int maxConsecutiveAnswers(string answerKey, int k) {
int num_T = 0, num_F = 0;
int ans = 0, left = 0;
for (int right = 0; right < answerKey.length(); right++) {
char ch = answerKey[right];
// A1
if (ch == 'T') {
num_T++;
} else {
num_F++;
}
// A2
while (min(num_T, num_F) > k) {
if (answerKey[left] == 'T') {
num_T--;
} else {
num_F--;
}
left++;
}
// A3
ans = max(ans, right - left + 1);
}
return ans;
}
};