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

题目描述

方法

1. 平均数+边界条件判断

class Solution:
    def findContinuousSequence(self, target: int) -> List[List[int]]:
        res = []
        for num in range(target//2, 1, -1):
            mid = target/num
            if mid - num // 2 <= 0:
                continue
            if num % 2 and int(mid) == mid:
                res.append(list(range(int(mid)-num//2, int(mid)+num//2+1)))
            elif not (num % 2) and mid - int(mid) == 0.5:
                res.append(list(range(int(mid)-num//2 +1, int(mid)+num//2+1)))
        return res

 2. 求和公式

当从i到j公差为1的等差数列求和为target,有

因此可以得到:

class Solution:
    def findContinuousSequence(self, target: int) -> List[List[int]]:
        i,j = 1,2
        res = []
        while i<j:
            j = (-1 + (1 + 4 * (2 * target + i * i - i)) ** 0.5) / 2
            if i<j and int(j) == j:
                res.append(list(range(i,int(j+1))))
            i+=1
        return res

 3. 双指针

class Solution:
    def findContinuousSequence(self, target: int) -> List[List[int]]:
        i, j = 1, 2
        s = 3
        res = []

        while i < j:
            if s == target:
                res.append(list(range(i, j + 1)))
                s -= i
                i += 1
            elif s > target:
                s -= i
                i += 1
            elif s < target:
                j += 1
                s += j
        return res

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值