LeetCode-413. 等差数列划分

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

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

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

思路:

  1. 将列表相邻元素的差求出来-----[diff]
  2. 对差的数量进行统计,相邻差相同个数加1,直到不相同将相同数量存入列表,数量重新设置为1-----[diff1]
  3. 对diff1进行循环,如果相邻差相同个数为2,3等等,那么对应的可构成等差数列的个数可以表示为从1到1,2的前n项和,推广之后就是相同个数为n,对应的可构成等差数列的个数为n-1的前n-1项和,公式为(n-1)(n)/2;感觉反应不过来的高中应该学过,前n项和=数列的个数*(第一项+最后一项)/2,这样就比较清晰了,在这道题中,第一项是1,最后一项是n-1,数列的个数是n-1,这样就有了(n-1)(n)/2
class Solution:
    def numberOfArithmeticSlices(self, nums: List[int]) -> int:
        if len(nums) == 1:
            return 0

        diff = []
        for i in range(1, len(nums)):
            diff.append(nums[i] - nums[i-1])
        # print(diff)

        diff1 = []
        j = 1
        for k in range(1, len(diff)):
            if diff[k] == diff[k-1]:
                j += 1
            else:
                diff1.append(j)
                j = 1
        diff1.append(j)
        # print(diff1)

        number = 0
        for k in range(len(diff1)):
            if diff1[k] >= 2:
                number += (diff1[k] * (diff1[k]-1)) // 2
        return number
posted @ 2021-08-10 11:14  小Aer  阅读(3)  评论(0编辑  收藏  举报  来源