滑动窗口 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 @ 2024-01-17 15:03  guanyubo  阅读(23)  评论(0编辑  收藏  举报