贪心算法
变量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