剑指offer实践 ——57.2.和为s的连续正数序列(python版)

本文介绍了如何使用双指针技巧解决找到和为s的连续正数序列的问题。通过设置两个指针l和r,不断调整它们的位置,确保子序列和在目标范围内。当子序列和小于目标值时扩大r,大于目标值时缩小l,等于目标值时记录子序列并移动l。时间复杂度为O(target),空间复杂度为O(1)。
摘要由CSDN通过智能技术生成



题目

和为s的连续正数序列
在这里插入图片描述


一、双指针实现滑动窗口

57.1.和为s的数字
和为s的正整数序列一定是在【1,2,……,s-1】这个数组中出现的。
仍旧设置两个指针:l,r 分别为1,2(因为这个子序列里至少有两个数字)。
l -> r 的子序列的和 < s 时,r可继续扩展,+1
l -> r 的子序列的和 > s 时,l+1
l -> r 的子序列的和 = s 时, 将这个子序列放入结果中,l+1继续寻找

l -> r 的子序列 是一个第一项为l,公差为1 的等差序列。求和时使用等差数列的求和公式:
在这里插入图片描述

def find_arr_with_sum_s_1(target):
    l, r = 1, 2
    res = []
    while l < r < target:
        sub_sum = int((r - l + 1) * (r + l) / 2)
        if sub_sum < target:
            r += 1
        elif sub_sum > target:
            l += 1
        else:
            res.append(list(range(l, r + 1)))
            l += 1
    return res

时间复杂度:由于两个指针移动均单调不减,且最多移动 target/2 次,即方法一提到的枚举的上界,所以时间复杂度为 O(target) 。

空间复杂度:O(1) ,除了答案数组只需要常数的空间存放若干变量。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值