滑动窗口 Sliding window
简介
滑动窗口算法是一种用于解决问题的技术,它将嵌套的两个循环转换为单个循环。该算法适用于数组或列表。通常,这些问题可以通过暴力方法以O(n²)或O(n³)的时间复杂度解决,但是滑动窗口技术可以将时间复杂度降低到O(n)。
滑动窗口算法的基本思想是将两个嵌套循环转换为单个循环。以下是一些基本线索,用于识别滑动窗口算法问题:
- 问题基于数组、列表或字符串类型的数据结构。
- 问题要求在数组中找到子范围,以给出最长、最短或目标值的字符串。
- 该算法的概念主要基于满足给定条件的最长或最短序列的想法。
解决使用滑动窗口算法的问题的基本步骤如下:
- 使用HashMap或字典来计算特定数组输入的计数,并使用外部循环向右增加窗口。
- 使用内部循环向右滑动窗口以减小窗口大小。
- 根据问题陈述存储当前最大或最小窗口大小或计数。
以下是使用滑动窗口算法解决问题的示例代码:
# 使用滑动窗口算法找到数组中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;
}
};
多用组合、少用继承
基于接口而非实现进行编程