dp[i] 表示以位置 i 为结尾的等差子数组个数
所以对于位置i+1处,其dp[i+1]与dp[i]的关系为dp[i]+1; 为什么要加1呢,比如dp[i]={(1,2,3,4),(2,3,4)}均为以4结尾的,然后现在i+1位置值为5,那么dp[i+1]可以为{(1,2,3,4,5),(2,3,4,5),(3,4,5)},可以发现本来对于dp[i]的(3,4)不构成等差数列,但现在加了5就新加了一个。对于每个i都是如此。都会基于上一个的长度为2的新构成一个新的等差数列。所以会加1
然后遍历dp数组,求和结果就是所有的子数组数目
class Solution { public: int numberOfArithmeticSlices(vector<int>& nums) { int n = nums.size(); if (n < 3) return 0;//小于3不构成等差数列直接返回0 vector<int> dp(n, 0); for (int i = 2; i < n; ++i) { if (nums[i] - nums[i-1] == nums[i-1] - nums[i-2]) { dp[i] = dp[i-1] + 1; } } return accumulate(dp.begin(), dp.end(), 0);//求和 } };