输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。
序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。
示例 1:
输入:target = 9
输出:[[2,3,4],[4,5]]
示例 2:
输入:target = 15
输出:[[1,2,3,4,5],[4,5,6],[7,8]]
分析
-
定义两个指针,left和right指向数组的第一位,定义一个mid=target/2,由于序列内的数字由小到大排列,如果在mid之前都没有满足条件的那么在mid之后的数之和是大于target的不需要考虑。定义sum用来保存和
-
从第一位开始,如果sum < target(说明小于目标值),则sum+=right,right后移(right++),
如果sum > target(说明大于目标值),则sum-=left,left后移(left++),
如果sum = target,将left和right之间的数字存放在arr中,此时前面的序列已经组合完毕,需要left后移。 -
最后将每个arr中的数字放入list中,最终返回list
/**
* @param {number} target
* @return {number[][]}
*/
/**
* @param {number} target
* @return {number[][]}
*/
var findContinuousSequence = function(target) {
let left = 1;
let right = 1;
let list = [];
let sum = 0;
let mid = target/2;
while(left < mid){
if(sum < target){
sum += right;
right++;
}else if(sum > target){
sum -= left;
left++;
}else{
let arr = [];
for(let i = left; i < right; i++){
arr.push(i);
}
list.push(arr);
sum -= left;
left++;
}
}
return list;
};