LeeCode 413 python 详解

在这里插入图片描述
贪心算法
变量l记录当前遍历位置之前最长的等差数列,每次中断则计算子等差序列中所有的子数组,
计算方式为:res = l - k + 1 (k = 3,4,…l) res为子等差序列中所有大于等于3 小于等于l的子数组
若中断,则l从零开始
等差数列的遍历从下标1开始到下标n-2结束,若任意两个相邻元素之差相同,且l=0 则l+3,否则l+1,例如[1,2,3,4], 初始l=0,从2开始,2满足条件,则l+=3(表示当前子序列为1,2,3),3满足条件,则l+=1(把4的长度加到子序列中)。
边界条件:如果最后一个子序列在遍历到n-2时都没有中断,则判断最后数组中的最后3个元素是否为等差序列,若是则需要计算最后一个子序列所包含的等差子数组

class Solution:
    def numberOfArithmeticSlices(self, nums: List[int]) -> int:
        n = len(nums)
        if n < 3:
            return 0
        res = 0
        i = 1
        l = 0
        def fun(l):
            k = 3
            res = 0
            while k <= l:     # 计算所有子等差序列的个数
                res += l - k +1
                k += 1
            return res
        while i < n-1:
            if nums[i] - nums[i-1] == nums[i+1] - nums[i]:  # 满足条件则添加长度到l
                if l == 0:
                    l += 3
                else:
                    l += 1
            else:
                res += fun(l)   # 中断则计算该等差子序列的所有子等差数组
                l = 0           # 长度从0开始
            i += 1
        if nums[-2] - nums[-3] == nums[-1] - nums[-2]:   # 最后一个等差子序列(边界条件)
            res += fun(l)
        return res
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值