剑指 Offer 57 - II. 和为s的连续正数序列
Posted 炫云云
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 Offer 57 - II. 和为s的连续正数序列相关的知识,希望对你有一定的参考价值。
剑指 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]]
滑动窗口
设连续正整数序列的左边界
i
i
i 和右边界
j
j
j ,则可构建滑动窗口从左向右滑动。循环中,每轮判断滑动 窗口内元素和与目标值
target
\\operatorname{target}
target 的大小关系,若相等则记录结果,若大于 target 则移动左边界
i
i \\quad
i (以减
小窗口内的元素和) ,若小于
target
\\operatorname{target}
target 则移动右边界
j
j
j (以增大窗口内的元素和)。
算法流程:
-
初始化: 左边界 i = 1 i=1 i=1, 右边界 j = 2 j=2 j=2, 元素和 s = 3 s=3 s=3, 结果列表 r e s r e s res;
-
循环:当 i ≥ j i \\geq j i≥j 时跳出;
- 当 s > s> s> target 时: 向右移动左边界 i = i + 1 i=i+1 i=i+1, 并更新元素和 s s s;
- 当 s < s< s< target 时: 向右移动右边界 j = j + 1 j=j+1 j=j+1, 并更新元素和 s s s;
- 当 s = t a r g e t s= target s=target 时:记录连续整数序列, 并向右移动左边界 i = i + 1 i=i+1 i=i+1
-
返回值:返回结果列表 r e s r e s res;
观察本文的算法流程发现,当 s = target 和 s > target 的移动边界操作相同,因此可以合并,代码如下所示。
class Solution(object):
def findContinuousSequence(self, target):
"""
:type target: int
:rtype: List[List[int]]
"""
i, j, s, res = 1, 2, 3, []
while i < j:
if s == target:
res.append(list(range(i, j + 1)))
s -= i
i += 1
if s > target:
# 左边界向右移动
s -= i
i += 1
else:
# 右边界向右移动
j += 1
s += j
return res
参考
以上是关于剑指 Offer 57 - II. 和为s的连续正数序列的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode Algorithm 剑指 Offer 57 - II. 和为s的连续正数序列
Leetcode剑指 Offer 57 - II. 和为s的连续正数序列(双指针)
LeetCode剑指offer57 II和为s的连续正数序列(用vector模拟滑动窗口)
1787. 使所有区间的异或结果为零 / 剑指Offer56 - I. 数组中数字出现的次数 / 剑指Offer56 - II. 数组中数字出现的次数 II / 剑指Offer57.和为s的两个数字(