Leetcode62双周赛C
分析母题
通过简单的分析,我们可以发现如果,将T看做1,而F看做0,则问题就转化为另一个题目最大连续1的个数III,而这道题目是典型的利用滑动窗口的题目了。
我们先分析母题,我们设前缀和为p[i],该前缀和中,记录的是0的数量。则对一个区间,其中0的数量即为
\[res=p[r]-p[l-1]
\]
只要该数小于等于k即可。
母题AcCode
class Solution {
public:
int longestOnes(vector<int>& nums, int k) {
int n = nums.size();
int l=0;
int rsum=0,lsum=0,ans=0;
for(int r=0;r<n;r++)
{
rsum+=1-nums[r];
while(lsum<rsum-k)
{
lsum+=1-nums[l];
l++;
}
ans=max(ans,r-l+1);
}
return ans;
}
};
分析原题
此时我们回过头来看原题,那我们要计算的就是,对总数上多的,用一下母题的算法即可
而且,从上面两题的分析中,突然想到了,这是一个很经常用的小技巧,用前缀和数组来看这个区间内某些特性数字的数量,可以与树状数组联合使用。
原题AcCode
class Solution {
public:
int maxConsecutiveAnswers(string answerKey, int k) {
int n = answerKey.size();
int max_len = 0;
int t=0,f=0;
int front = 0;
for(int i=0;i<n;i++){
if(answerKey[i]=='T') t++;
if(answerKey[i]=='F') f++;
if(t>f){//以T为主
if(f>k){
if(answerKey[front]=='F') f--;
else t--;
front++;
}
}
else {
if(t>k){
if(answerKey[front]=='F') f--;
else t--;
front++;
}
}
max_len = max(max_len,t+f);
}
return max_len;
}
};

浙公网安备 33010602011771号