【leetcode】数组篇刷题 --滑动窗口

/*
 * @lc app=leetcode.cn id=209 lang=cpp
 *
 * [209] 长度最小的子数组
 * 找最短的子数组
 */

// @lc code=start
class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        //滑动窗口,
        //一个计算总和
        int sum = 0;
        //一个记录当前最短子串长度结果,
        int result = INT32_MAX;
        //一个慢指针,一个快指针,快指针匹配到子串,通过收缩慢指针达到缩小窗口(滑动窗口),
        int lp = 0;
        int rp = 0;
        int subLength = 0;
        for(;rp < nums.size(); rp++){
            //计算当前滑动窗口内子串长度
            sum += nums[rp];

            //匹配到了sum == target的子串
            while(sum >= target){
                subLength = (rp - lp + 1);
                result = result < subLength ? result : subLength;
                //滑动窗口向右移动(即向右缩小滑动窗口)
                sum -= nums[lp++];
            }

        }
        return result == INT32_MAX ? 0 : result;
    }
};
// @lc code=end


/*
 * @lc app=leetcode.cn id=904 lang=cpp
 *
 * [904] 水果成篮
 */

// @lc code=start
class Solution {
public:
    int totalFruit(vector<int>& fruits) {
        //一个map统计果篮中A,B两种水果各自的数量,一但果篮中放入水果C,就扔掉所有A类水果
         unordered_map<int, int> map;
        //一对快慢指针
        int rp = 0;
        int lp = 0;
        //记录最长子序列
        int result = 0;
        for(;rp < fruits.size(); rp++){
            // ++map[fruits[rp]];
            //记录某一类型水果并统计其数量
            map[fruits[rp]]++;
            //果篮中放入了第3种水果
            while(map.size() > 2){
                //扔掉最先放入的所有A类水果
                //获取指向该键值对的迭代器
                auto it = map.find(fruits[lp]);
                //first为key,second为value
                (it->second)--;
                //A类水果已扔完
                if(it->second == 0){
                    map.erase(it);
                }
                //扔水果的同时缩小滑动窗口(仍水果正是处于此目的)
                lp++;
            }
            

            result = max(result, rp - lp + 1);
        }
        return result;

    }
};
// @lc code=end


posted @ 2024-02-25 22:35  main(void)  阅读(2)  评论(0编辑  收藏  举报
.c_ad_block { display: none !important; } #ad_t2{ display: none !important; }