剑指 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 (以增大窗口内的元素和)。

算法流程:

  1. 初始化: 左边界 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;

  2. 循环:当 i ≥ j i \\geq j ij​ 时跳出;

    • 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
  3. 返回值:返回结果列表 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


参考

Krahets - 力扣(LeetCode) (leetcode-cn.com)

以上是关于剑指 Offer 57 - II. 和为s的连续正数序列的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode Algorithm 剑指 Offer 57 - II. 和为s的连续正数序列

剑指offer双指针 57-II.和为s的连续正数序列

Leetcode剑指 Offer 57 - II. 和为s的连续正数序列(双指针)

LeetCode剑指offer57 II和为s的连续正数序列(用vector模拟滑动窗口)

0510-II173942555757-II64

1787. 使所有区间的异或结果为零 / 剑指Offer56 - I. 数组中数字出现的次数 / 剑指Offer56 - II. 数组中数字出现的次数 II / 剑指Offer57.和为s的两个数字(