滑动窗口 Sliding window


简介

滑动窗口算法是一种用于解决问题的技术,它将嵌套的两个循环转换为单个循环。该算法适用于数组或列表。通常,这些问题可以通过暴力方法以O(n²)或O(n³)的时间复杂度解决,但是滑动窗口技术可以将时间复杂度降低到O(n)。

滑动窗口算法的基本思想是将两个嵌套循环转换为单个循环。以下是一些基本线索,用于识别滑动窗口算法问题:

  • 问题基于数组、列表或字符串类型的数据结构。
  • 问题要求在数组中找到子范围,以给出最长、最短或目标值的字符串。
  • 该算法的概念主要基于满足给定条件的最长或最短序列的想法。

解决使用滑动窗口算法的问题的基本步骤如下:

  1. 使用HashMap或字典来计算特定数组输入的计数,并使用外部循环向右增加窗口。
  2. 使用内部循环向右滑动窗口以减小窗口大小。
  3. 根据问题陈述存储当前最大或最小窗口大小或计数。

以下是使用滑动窗口算法解决问题的示例代码:

# 使用滑动窗口算法找到数组中5个连续数字的最大和
def getMaxSum(arr, k):
    maxSum = 0
    windowSum = 0
    start = 0
    
    for i in range(len(arr)):
        windowSum += arr[i]
        
        if ((i - start + 1) == k):
            maxSum = max(maxSum, windowSum)
            windowSum -= arr[start]
            start += 1
    
    return maxSum

这是滑动窗口算法的基本概述和示例代码。

滑动窗口算法可以用于解决各种问题,例如查找最大子数组的和、计算变位词的出现次数、计算连续子数组的最大和与最小和之间的差异等。


长度最小的子数组

题目链接

题目描述:
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。

算法描述:

class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        int n = nums.size();
        if (n == 0) {
            return 0;
        }
        int ans = INT_MAX;
        int start = 0, end = 0;
        int sum = 0;
        while (end < n) {
            sum += nums[end];
            while (sum >= s) {
                ans = min(ans, end - start + 1);
                sum -= nums[start];
                start++;
            }
            end++;
        }
        return ans == INT_MAX ? 0 : ans;
    }
};
posted @   guanyubo  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
点击右上角即可分享
微信分享提示