413. 等差数列划分
题目
如果一个数列 至少有三个元素 ,并且任意两个相邻元素之差相同,则称该数列为等差数列。
- 例如,
[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
提示:
1 <= nums.length <= 5000
-1000 <= nums[i] <= 1000
思路
因为题目中给出的数组并不是等差数列,所以我们需要判断相邻的三个数是否为等差数列,如果是,我们就要计算以当前循环中的nums[i]结尾的等差数列的个数有多少,把数组中以每个数为结尾的等差数列的个数全部加起来就是最终我们需要的结果。代码中c[i]=c[i-1]+1就表示在原先找到的等差数列的基础上又找到一个更长的等差数列,在用count+=c[i]把所有结果都加起来就是最终的结果。
代码
class Solution {
public:int numberOfArithmeticSlices(vector<int>& nums) {int n=nums.size(),count=0;if(n<3)//数组长度小于3,不构成等差数列{return 0;}vector<int> c(n,0);for(int i=2;i<n;i++){if(nums[i]-nums[i-1]==nums[i-1]-nums[i-2])//判断这三个数是否为等差数列{c[i]=c[i-1]+1;//c[i]表示以nums[i]结尾的等差数列的个数count+=c[i];//到索引i的等差数列的个数}}return count;}
};