LeetCode-413. 等差数列划分
如果一个数列 至少有三个元素 ,并且任意两个相邻元素之差相同,则称该数列为等差数列。
例如,[1,3,5,7,9]、[7,7,7,7] 和 [3,-1,-5,-9] 都是等差数列。
给你一个整数数组 nums ,返回数组 nums 中所有为等差数组的 子数组 个数。
子数组 是数组中的一个连续序列。
思路:
- 将列表相邻元素的差求出来-----[diff]
- 对差的数量进行统计,相邻差相同个数加1,直到不相同将相同数量存入列表,数量重新设置为1-----[diff1]
- 对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