永远无法保证有人会喜欢你。 所以如果有人喜欢你,你就已经赢了。

题目描述:

长度最小的子数组

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

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

解题代码:

c++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
public:

int minSubArrayLen(int target, vector<int>& nums) {
int i = 0;
int ans = INT_MAX;
int sum = 0;
for(int j = 0; j < nums.size(); j++){
sum += nums[j];
while(sum >= target){
ans = (j - i + 1) > ans ? ans : (j - i + 1);
sum -= nums[i++];
}
}
if(ans == INT_MAX) return 0;
else{
return ans;
}
}
};

image-20231102211703168

解读与收获:

滑动窗口方法:

以下思路是比较形象的滑动窗口问题的解题步骤,但有些题目找到窗口限定比较隐晦,需要具体问题具体分析:

(1)初始化窗口:
初始化左右边界 left = right = 0,把索引闭区间 [left, right] 称为一个「窗口」。

(2)寻找可行解:
我们先不断地增加 right 指针扩大窗口 [left, right],直到窗口中的满足可行解。

(3)优化可行解:
此时,我们停止增加 right,转而不断增加 left 指针缩小窗口 [left, right],直到窗口中的可行解不再符合要求。同时,每次增加 left,我们都要更新一轮结果。

(4)滑动窗口,直至一次遍历结束:
重复第 2 和第 3 步,直到 right 到达到的尽头。

比较适用于需要在不改变数组原顺序的情况下选择满足要求的子数组,本题套用上述模板就能找到解题方法。