题目描述
如果一个数列至少有三个元素 ,并且任意两个相邻元素之差相同,则称该数列为等差数列。 给你一个整数数组 nums ,返回数组 nums 中所有为等差数组的子数组个数。
子数组:数组中连续的一段元素。
示例: 输入:nums = [1,2,3,4] 输出:3 解释:三个等差子数组:[1,2,3]、[2,3,4]、[1,2,3,4]
思路分析(动态规划)

核心定义
dp[i]:以 nums i 结尾的、满足条件的等差子数组数量。
- 边界条件:
- 数组长度小于 3,直接返回 0,无法形成等差数列。
dp[0]=0、dp[1]=0,前两个元素无法构成子数组。
- 状态转移方程:
- 如果
nums[i]-nums[i-1] == nums[i-1]-nums[i-2](公差相等):dp[i] = dp[i-1] + 1理解:在以i-1结尾的等差子数组基础上,新增nums[i],会多出1 个新的等差子数组 - 公差不相等:
dp[i]=0,以i结尾没有等差子数组
- 如果
- 结果:把全部
dp[i]累加,就是总的等差子数组数量。
举例子
[1,2,3,4]i=2:1,2,3 等差 → dp 2=1,ret=1 i=3:2,3,4 等差 → dp 3=dp 2+1=2,ret=1+2=3,和答案一致
cpp
class Solution {
public:
int numberOfArithmeticSlices(vector<int>& nums) {
int n=nums.size();
if(n==1||n==2)return 0;
vector<int>dp(n,0);
dp[0]=0,dp[1]=0;
int ret=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;
else
dp[i]=0;
ret+=dp[i];
}
return ret;
}
};