一、题目
输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。
序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。
示例 1:
输入:target = 9
输出:[[2,3,4],[4,5]]
示例 2:
输入:target = 15
输出:[[1,2,3,4,5],[4,5,6],[7,8]]
限制:
- 1 <= target <= 10^5
二、解决
1、滑动窗口
思路:
滑动数组:可看成数组中框起来的一个部分。为编程方便,设置为左闭右开区间。
初始值:i=1,j=1,滑动窗口位于序列最左侧,窗口大小为0。
性质 :窗口的左边界和右边界永远只能向右移动,而不能向左移动。
过程:
- 定义:窗口内几个数和
sum
,左端点i
,右端点j
。 - 窗口移动与结果记录:
2.1. ifsum < target
,sum
需要增加,即扩大窗口,右边界右移,j++
;
2.2. ifsum > target
,sum
需要减少,即缩小窗口,左边界右移,i++
;
2.3. ifsum = target
,记录此时结果,即记下[i, j)
的元素。这也是唯一一个i
开头的序列。 接下来,左边界右移,i++
; - 遍历完毕,返回结果集。
问题:窗口移动能找到全部解吗?
分析:
1) 1 + 2 +...+