问题描述与解题思路
确定本题的状态表示
f[i]表示以nums[i]为终点的最长等差子数组的长度
f[i]-2表示的是以nums[i]为终点的等差子数组的个数
由于这俩就差二,所以我们只要改变一下f[i]的起点就能实现意义的转换(理解的时候可以按照长度去理解)
确定本题的状态转移方程
if(nums[i]+nums[i-2]==2*nums[i-1])
f[i]=f[i-1]+1;
else
f[i]=0;
填表求值
根据初始条件和状态转移方程,确定填表顺序,进而逐步填满dp表,最终返回题目要的结果
代码实现
class Solution {
public:
int numberOfArithmeticSlices(vector<int>& nums) {
// 若f[i]表示以nums[i]为终点的最长等差子数组的长度
// 则f[i]-2表示的就是以nums[i]为终点的等差子数组的个数
// 由于这俩就差二,所以我们只要改变一下f[i]的起点就能实现意义的转换
int n=nums.size();
int ret=0;
vector<int> f(n,0);
for(int i=2;i<n;i++){
if(nums[i]+nums[i-2]==2*nums[i-1])
f[i]=f[i-1]+1;
else
f[i]=0;
ret+=f[i];
}
return ret;
}
};

526

被折叠的 条评论
为什么被折叠?



