JZ41-和为S的连续正数序列

描述

小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!

返回值描述:

输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序

示例1

输入:

1
9

返回值:

1
[[2,3,4],[4,5]]

题解

双指针的思路:由于要求连续的整数,所以可以从头开始扩大窗口

利用前n项和公式:(n*(1+n))/2可求得窗口内的和

当窗口内的和<给定参数时,右指针后移

当窗口内的和=给定参数时,用集合纪录下这组数据push到数组中,右指针后移

当窗口内的和>给定参数时,左指针后移减小窗口

最后返回那个数组即可

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function FindContinuousSequence(sum) {
// write code here
let left = 1;//左指针为初值为1
let right = 2; //右指针初值为2

let arr = [];
while(left<right){
let total = (left+right)*(right-left+1)/2;
if(total<sum){
right++;
}
else if(total==sum){
let set = new Set();
for(let i = left;i<=right;i++){
set.add(i); //加入到集合中
}
arr.push([...set]);
right++;
}else if(total>sum){
left++;
}
}
return arr;
}

主要是双指针的思想,同时要输出一个多维数组要用到集合的api,扩展运算符可以快速转化成数组


JZ41-和为S的连续正数序列
https://blog-theta-ten.vercel.app/2021/07/05/JZ41-和为S的连续正数序列/
作者
Chen
发布于
2021年7月5日
许可协议