剑指offerJZ41-和为S的连续正数和序列

在这里插入图片描述
解法一:for,for解法, 时间复杂度O(N^2)

class Solution:
    def FindContinuousSequence(self, tsum):
        if tsum <= 1:
            return []
        newli = []
        li = []
        sum = 0
        for i in range(1,tsum):
            sum = 0
            for j in range(i,tsum+1):
                sum += j
                if sum == tsum:
                    newli = range(i,j+1)
                   li.append(newli)
                    break
        return li

解法二:滑动窗口 时间复杂度O(N) 据说类似于tcp的滑动窗口协议(?)
补充知识:tcp的滑动窗口协议
为增加网络吞吐量,将数据包一起发送过去,产生这个概念
在这里插入图片描述
思路:
①初始化两指针small =1,big = 2
②while循环,循环条件small<系列数的一半(数大于等于2,注意这里tsum+1,就是因为奇数)
②如果相加大于S,small后移;如果相加等于S,添加序列,big后移;小于,big后移动

class Solution:
    def FindContinuousSequence(self, tsum):
        if tsum < 3:
            return 
        small = 1
        big = 2
        output = []
        middle = (tsum + 1) >> 1
        cursum = small + big
        while small < middle:
            if cursum == tsum:
                output.append(range(small,big + 1))
                big += 1
                cursum += big
            elif cursum > tsum:
                cursum -= small
                small += 1
            else:
                big += 1
                cursum += big 
        return output
  
class Solution:
    def findContinuousSequence(self, target: int) -> List[List[int]]:
        i,j,sum,res=1,1,0,[]
        while i <= target//2:
            if sum == target:#Python  range() 函数返回的是一个可迭代对象(类型是对象),而不是列表类型, 所以打印的时候不会打印列表
                res.append(list(range(i, j)))
                sum-=i
                i+=1
            elif sum < target:
                sum+=j
                j+=1
            else:
                sum-=i
                i+=1
        return res

解法三 :利用等差序列的特性 时间复杂度O(根号N)
思路:
在这里插入图片描述
在这里插入图片描述
很巧妙!
在这里插入图片描述
棒!根据这个地板除法,下面的代码还可以简化!注意边界!一不小心就错!

class Solution:
    def FindContinuousSequence(self, tsum):
        from math import sqrt# math模块
        res = []
        for div in range(2,int(sqrt(tsum*2))+1):# 明白时间复杂度来历了叭
            if (div%2==0 and tsum%div == div/2) or (div%2==1 and tsum%div == 0):# n为偶数时,sum = n(i+0.5) 
                start = tsum//div - div//2 + 1 if div%2==0 else tsum//div - div//2
                res.append(list(range(start, tsum//div + div//2 + 1)))# range在python3中返回的不再是一个list而是一个range对象
        return sorted(res)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值