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;
    }
};
posted @ 2021-10-08 18:06  艾特玖  阅读(44)  评论(0)    收藏  举报