一.滑动窗口(同向双指针)

适用情景:

最长连续字串满足某某要求

例子:

题目:

1
2
3
给定一个含有 `n` 个正整数的数组和一个正整数 `target` **。**

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

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <iostream>
#include <vector>
#include <algorithm>
#define INF 32767;
using namespace std ;
int Sum(vector<int>& nums, int i, int j) {
int sum = 0;
for(int m = i; m <=j; m++) {
sum += nums[m];
}
return sum;
}
int main() {
cout << "请输入数组长度" <<endl;
vector<int> nums;
int n;
cin >> n;
cout << "请输入n个数字" <<endl;
int a;
for(int i = 0; i < n; i++) {
cin >> a;
nums.push_back(a);
}
cout << "请输入target" << endl;
int target;
cin >> target;
int i = 0;
int j = 0;
int min = INF;
int left;
int right;
while(j < n) {
int sum = Sum(nums, i, j);

if(sum < target) {
j++;
}else {
if(j - i + 1 < min) {
min = j - i + 1;
left = i;
right = j;
}
i++;
}
}
cout << "子数组[";
for(int k = left; k <= right; k++) {
cout << nums[k] << ',';
}
cout << ']';
}

思想:

大了就将左端点右移,小了就将右端点左移。