# 题目描述
小明很喜欢数学,有一天他在做数学作业时,要求计算出 9~16
的和,他马上就写出了正确答案是 100
。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为 100
(至少包括两个数)。没多久,他就得到另一组连续正数和为 100 的序列:18,19,20,21,22
。现在把问题交给你,你能不能也很快的找出所有和为 S 的连续正数序列 ?
限制:
1 <= S <= 10^5
# 测试用例
用例 1:
- 输入:
target = 9
- 输出:
[[2,3,4],[4,5]]
用例2:
- 输入:
target = 15
- 输出:
[[1,2,3,4,5],[4,5,6],[7,8]]
# 思路
双指针模拟滑动窗口,具体可以参考代码实现中的注释
# 代码实现
var __readline = require("readline-sync");
__readline.setDefaultOptions({ prompt: "" });
var readline = __readline.prompt;
console.log("请输入target: ");
const target = parseInt(readline());
/**
* @param {number} target
* @return {number[][]}
*/
var findContinuousSequence = function (target) {
// 1 2 3 4 5 6 7 8
// 等差数列求和公式
// cur = (fast - slow + 1)(fast + slow) / 2
// 快慢指针模拟滑动窗口
let res = [];
let slow = 1;
let fast = 2;
let cur = 0;
while (slow < fast) {
cur = ((fast - slow + 1) * (fast + slow)) / 2;
if (cur === target) {
let temp = [];
for (let i = slow; i <= fast; i++) {
temp.push(i);
}
res.push(temp);
slow++;
fast++;
} else if (cur <= target) {
fast++;
} else {
slow++;
}
}
return res;
};
const res = findContinuousSequence(target);
console.log("结果为: ", res);
/*
请输入target:
15
结果为: [ [ 1, 2, 3, 4, 5 ], [ 4, 5, 6 ], [ 7, 8
] ]
请输入target:
9
结果为: [ [ 2, 3, 4 ], [ 4, 5 ] ]
*/
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
52
53
54
55
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
52
53
54
55