等差数列划分算法

**

如果一个数列 至少有三个元素 ,并且任意两个相邻元素之差相同,则称该数列为等差数列。

例如,[1,3,5,7,9]、[7,7,7,7] 和 [3,-1,-5,-9] 都是等差数列。
给你一个整数数组 nums ,返回数组 nums 中所有为等差数组的 子数组 个数。

子数组 是数组中的一个连续序列。

示例 1:

输入:nums = [1,2,3,4]
输出:3
解释:nums 中有三个子等差数组:[1, 2, 3]、[2, 3, 4] 和 [1,2,3,4] 自身。
示例 2:

输入:nums = [1]
输出:0

**
思路:刚开始拿到题目的时候,我简单的以为只要是数量为三的等差数列就行,后面发现并不对,因为他可以是四个,以及更多,然后我就开始思考,等差数列至少三个,如果是四个连续的,那就是三个,于是便有了以下的函数关系式:
在这里插入图片描述

经过推倒,我发现刚好是方差为一的求和公式,就是(n-2)(n-1)/2,于是就先写了下面的代码跑跑看

class Solution(object):
    def numberOfArithmeticSlices(self,nums):
        n=0
        total=0
        for i in range(len(nums)):
            if i==0:
                continue
            elif i==len(nums)-1:
                if n!=0:
                    total+=(n*(n+1))/2
                break
            elif nums[i]-nums[i-1]==nums[i+1]-nums[i]:
                n+=1
            else:
                if n!=0:
                    total+=(n*(n+1))/2
                n=0
        return total

提交之后发现是可以通过的,但是自己觉得复杂度还是太高,于是便看了一下官方的解法:

class Solution:
    def numberOfArithmeticSlices(self, nums: List[int]) -> int:
        n = len(nums)
        if n == 1:
            return 0
        
        d, t = nums[0] - nums[1], 0
        ans = 0
        
        # 因为等差数列的长度至少为 3,所以可以从 i=2 开始枚举
        for i in range(2, n):
            if nums[i - 1] - nums[i] == d:
                t += 1
            else:
                d = nums[i - 1] - nums[i]
                t = 0
            ans += t
        
        return ans

发现官方的复杂度为O(n),也是一样的,但是我觉得我的比官方的要好解释一点,官方的代码的意思就是先算一个方差,之后看后面的是这个发差的有几个数,运用的也是我的那个求和方法,所以我觉得官方的没我这个好理解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值