Orion's Studio.

算法(5)-长度最小的子数组和滑动窗口

2024/03/06

题目(medium):

给定一个含有 n 个正整数的数组和一个正整数 target 。

找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。

思路

暴力求解是两层 for 循环遍历,时间复杂度是 O(n^2),空间复杂度是 O(1)。

滑动窗口

就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const minSubArrayLen = (target, nums) => {
let start = 0;
let end = 0;
let sum = 0;
let len = nums.length;
let ans = Infinity;
while(end < len) {
sum += nums[end];
while(sum >= target) {
ans = Math.min(ans, end - start + 1);
sum -= nums[start];
start++;
}
end++;
}
return ans === Infinity ? 0 : ans;
}

时间复杂度:O(n)。
空间复杂度:O(1)。

CATALOG
  1. 1. 题目(medium):
  2. 2. 思路
    1. 2.1. 滑动窗口