剑指 Offer 57 - II. 和为s的连续正数序列
题目描述
输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。
序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。
示例 1:
输入:target = 9
输出:[[2,3,4],[4,5]]
解法:双指针之滑动窗口
算法流程:
- 初始化: 左边界 i = 1 ,右边界 j = 2 ,元素和 s = 3 ,结果列表 res ;
- 循环: 当 i < sum/2时跳出;
- 当 s > sum时: 更新元素和 s ,并向右移动左边界 i = i + 1;
- 当 s < sum 时: 向右移动右边界 j = j + 1 ,并更新元素和 s ;
- 当 s = sum 时: 记录连续整数序列,并向右移动左边界 i = i + 1 ;
- 返回值: 返回结果列表 res ;
复杂度分析:时间复杂度 O(N) ;空间复杂度 O(1)。
function FindContinuousSequence(sum)
{
let res = [], i = 1, j = 2, s = 3
if(sum <= 2) return []
while(i < sum/2){
if(s < sum){
j ++
s += j
}else if(s > sum){
s -= i
i ++
}else{
let arr = []
for(let k = i; k <= j; k++){
arr.push(k)
}
res.push(arr)
s -= i
i ++
}
}
return res
}