关于leetcode:leetcode-滑动窗口

6次阅读

共计 1273 个字符,预计需要花费 4 分钟才能阅读完成。

最小滑窗模板:给定数组 nums,定义滑窗的左右边界 i, j,求满足某个条件的滑窗的最小长度。

while j < len(nums):
    判断 [i, j] 是否满足条件
    while 满足条件:不断更新后果(留神在 while 内更新!)
        i += 1(最大水平的压缩 i,使得滑窗尽可能的小)j += 1
//209. 长度最小的子数组
    int minSubArrayLen(int target, vector<int>& nums) {
        int left = 0, right = 0;
        int res = INT_MAX;
        int sum = 0;
        for (int i = 0; i < nums.size(); i++)
        {sum += nums[i];
            // 留神这里应用 while,每次更新 i(起始地位),并一直比拟子序列是否符合条件
            while (sum >= target) {int subLength = (i - left + 1); // 取子序列的长度
                res = res < subLength ? res : subLength;
                if (res == 1 && sum == target)
                {return res;}
                sum -= nums[left++]; // 这里体现出滑动窗口的精华之处,一直变更 i(子序列的起始地位)}
        }
        // 如果 result 没有被赋值的话,就返回 0,阐明没有符合条件的子序列
        return res == INT32_MAX ? 0 : res;
    }

最大滑窗模板:给定数组 nums,定义滑窗的左右边界 i, j,求满足某个条件的滑窗的最大长度。

while j < len(nums):
    判断 [i, j] 是否满足条件
    while 不满足条件:i += 1(最激进的压缩 i,一旦满足条件了就退出压缩 i 的过程,使得滑窗尽可能的大)不断更新后果(留神在 while 外更新!)j += 1
//904. 水果成篮
    int totalFruit(vector<int>& fruits) {
        // 滑动窗口法
        int left = 0; // 滑动窗口左边界
        int sub_len = 0; // 子序列长度
        int fruit_counter = 0; // 篮子中的水果品种数
        int len = fruits.size();

        unordered_map<int, int> basket; // 创立篮子
        for (int j = 0; j < len; j++) 
        {if (basket[fruits[j]] == 0) // 以后水果数量在篮子中数量为零
            {fruit_counter++;}
            basket[fruits[j]]++;


            while (fruit_counter > 2)// 如果篮子中的水果数目超过两种,则须要挪动左边界
            {basket[fruits[left]]--;

                // 若对应水果 key 的 value 变为 0,阐明篮子里曾经没有这种水果了,水果品种要对应变动(留神 basket[fruits[left]] == 0 即右边的水果数量为 0)if (basket[fruits[left]] == 0)
                {fruit_counter--;}
                left++;
            }

            sub_len = max(sub_len, j - left + 1);    
        }
        return sub_len;
    }

最大滑窗是在迭代右移右边界的过程中更新后果,而最小滑窗是在迭代右移左边界的过程中更新后果

正文完
 0