**
如果一个数列 至少有三个元素 ,并且任意两个相邻元素之差相同,则称该数列为等差数列。
例如,[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),也是一样的,但是我觉得我的比官方的要好解释一点,官方的代码的意思就是先算一个方差,之后看后面的是这个发差的有几个数,运用的也是我的那个求和方法,所以我觉得官方的没我这个好理解