【五月集训】(第六天)—— 滑动窗口


解题报告

学生分数的最小差值

题目链接:1984. 学生分数的最小差值

解题思路

将分数排序,滑动窗口的大小为k,向后遍历最大最小分数的差值,取最小值

class Solution {
public:
    int minimumDifference(vector<int>& nums, int k) {
        int n = nums.size();
        sort(nums.begin(), nums.end());
        int l = 0, r = k - 1, minSub = 100000;
        for(; r < n; l ++ ,r ++ ){
            minSub = min(minSub, nums[r] - nums[l]);
        }
        return minSub;
    }
};

长度为三且各字符不同的子字符串

题目链接:1876. 长度为三且各字符不同的子字符串

解题思路

长度为3的滑动窗口遍历数组,每遍历三个字符,用哈希数组记录每个字符出现的个数,如果每个字符出现的次数都不大于1,则答案 +1。

class Solution {
public:
    int countGoodSubstrings(string s) {
        int n = s.size();
        int ans = 0, flag = 0;
        for(int i = 0; i < n - 2; i ++ ){
            int hash[30] = {0};
            flag = 0;
            for(int j = i; j < i + 3; j ++ ){
                if(!hash[s[j] - 'a']) 
                   hash[s[j] - 'a'] ++ ;
                else
                    flag = 1;
            }
            if(!flag)
                ans ++ ;
        }
        return ans;
    }
};

所有元音按顺序排布的最长子字符串

题目链接:1839. 所有元音按顺序排布的最长子字符串

解题思路

两个指针,l确定子串的起始位置,r向右遍历。
(1)当后一个字符大于前一个字符,r 向右走一步。
(2)用一个计数器记录子串不同字符的数量,只有子串包含5个元音字符才符合条件,若不满足5个,计数器不会增到5。
(3)当子串满足第一个字符为’a’,最后一个字符为’u’且包含5个元音字符,则找到一个符合的子串。
(4)分割之前的子串,继续向后遍历。

class Solution {
public:
    int longestBeautifulSubstring(string word) {
        int n = word.size();
        int l = 0, r = 1, maxlen = 0, num;
        while(r < n){
            num = 1;
            while(r < n && word[r] >= word[r - 1]){                //(1)
                if(word[r] > word[r - 1])                          //(2)
                    num ++ ;
                r ++ ;
            }
            if(word[l] == 'a' && word[r - 1] == 'u' && num == 5)   //(3)
                maxlen = max(maxlen, r - l);
            l = r;                                                 //(4)
            r ++ ;
        }
        return maxlen;
    }
};

爱生气的书店老板

题目链接:1052. 爱生气的书店老板

解题思路

分为两个部分,第一部分求一定会满意的顾客人数,第二部分求在minutes分钟内可以额外增加的最大的人数,两个结果相加即为最终答案。
(1)求一定会满意的人数,即加上所有老板不生气时的到店人数。
(2)当前不满意的人数。
(3)当遍历的窗口大小等于minutes,得到当前minutes窗口内可以额外增加的人数,取最大值,窗口继续向后遍历,l ++ 。
(4)最终答案两个部分相加。

class Solution {
public:
    int maxSatisfied(vector<int>& customers, vector<int>& grumpy, int minutes) {
        int n = customers.size();
        int l = 0, r = 0, ans = 0, extra = 0;
        for(int i = 0; i < n; i ++ ){                  //(1)
            if(grumpy[i] == 0)
                ans += customers[i];
        }
        int tmp = 0;
        while(r < n){                                  
            tmp += customers[r] * grumpy[r];           //(2)
            r ++ ;
            if(r - l == minutes){                      //(3)
                extra = max(extra, tmp);
                tmp -= customers[l] * grumpy[l];
                l ++ ;
            }
        }
        ans += extra;                                  //(4)
        return ans;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值