滑动窗口:
连续正整数:即窗口内所有值
c++
class Solution {
public:
vector<vector<int>> findContinuousSequence(int target) {
vector<vector<int>> res;
int i = 1; // 滑动窗口的左边界
int j = 2; // 滑动窗口的右边界
int sum = 3; // 滑动窗口中数字的和
while (i <= target / 2){ // (target/2) x 2 = target, i右边大于target/2,则区间内和必大于target
if(sum == target){
vector<int> arr;
for (int k = i; k <= j; k++) { // 记录窗口内值,左边界继续向右移动
arr.push_back(k);
}
res.push_back(arr);
sum -= i; // 窗口减去准备去掉的左边界值
i++; // 左边界右移
}else if (sum < target){ // 窗口要增大, 右边界向右移动 (左边界左边已经遍历过)
j++;
sum += j;
}else{ // 窗口要减小, 左边界向右移动
sum -= i; // 窗口减去准备去掉的左边界值
i++; // 左边界右移
}
}
return res;
}
};
python
class Solution:
def findContinuousSequence(self, target: int) -> List[List[int]]:
res = []
l = 1 # 正整数从1开始
r = 2 # 序列至少2个整数
sum = 3 # 初始窗口和为3
while l < (target/2):
if sum == target:
res.append(list(range(l, r + 1)))
sum -= l # 窗口减去准备去掉的左边界值
l += 1 # 左边界右移
elif sum < target: # 和小了,窗口增大, 右边界右移
r += 1
sum += r # 右移后, 更新窗口值
else: # 和大了,窗口减小, 左边界右移
sum -= l # 左移前, 减去左边界
l += 1
return res