「剑指 Offer 57 - II. 和为s的连续正数序列」
- 滑动窗口思路,窗口初始化为
[1, 2]
,初始sum
为3
- 因为输出的序列至少有
2
个数,所以若窗口第一个数大于target/2
时,就不再继续了 - 若
sum
太小,向窗口添加下一个数,更新sum
- 若
sum
太大,弹出窗口第一个数,更新sum
- 若
sum===target
,则将窗口的数放入res
,随后弹出第一个数,继续滑动
const findContinuousSequence = target => {
const res = [];
const window = [1, 2];
let sum = 3;
while (window[0] <= target >> 1) {
if (sum < target) {
const num = window[window.length - 1] + 1;
sum += num;
window.push(num);
} else if (sum > target) {
sum -= window.shift();
} else {
res.push([...window]);
sum -= window.shift();
}
}
return res;
};