剑指 Offer 57 - II. 和为s的连续正数序列
输入一个正整数 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
来源:力扣(LeetCode)
链接:力扣
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
一解
使用滑动窗口,设 l,r 两个指针,s = l + l+1 + .. + r
,若:
-
s > target: l 向右滑动
-
s < target: r 向右滑动
-
s == target: 结果放入 s , r 向右滑动
class Solution:
def findContinuousSequence(self, target: int) -> List[List[int]]:
l, r, s, res = 1, 2, 3, []
while l < r:
if s == target:
res.append(list(range(l, r + 1)))
if s >= target:
s -= l
l += 1
else:
r += 1
s += r
return res