题目描述:
输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。
序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。
示例 1:
输入:target = 9
输出:[[2,3,4],[4,5]]
示例 2:
输入:target = 15
输出:[[1,2,3,4,5],[4,5,6],[7,8]]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof
知识点:
- 双指针,搜索
解题思路:
- 这道题给我们一个目标值,让我们求某一连续正数序列的和为目标值
- 假设目标值为9,那么可以取到的正数序列为2,3,4与4,5
- 这道题我们可以用一个滑动窗口来解决,我们让窗口在[1~目标值]之间滑动,我们需要实时更新滑动窗口中的数据,如果滑动窗口中的数值大于目标值我们需要让滑动窗口的总值减去left,并且left++,相反我们需要让right++,滑动窗口的总值加上right
- 最后特殊处理的是如果滑动窗口的总值等于目标值我们首先需要让right++,再进行计算,如果让left++可能会遗漏掉某些数
解题代码:
function FindContinuousSequence(sum){// write code hereconst res = [];function add (start,end){let arr = [];for(let i = start;i<=end;i++) {arr.push(i);}return arr;}let left = 1;let right = 2;let tempSum = left + right;while(left < right && right <= sum){if(tempSum === sum){res.push(add(left,right));right++tempSum += right;}else if(tempSum > sum){tempSum -= left;left++;}else if(tempSum < sum){right++;tempSum += right;}}return res;}
