状
态
表
示
:
f
[
i
]
状态表示:f[i]
状态表示:f[i]
属 性 : 从 前 i 个 数 中 选 , 以 第 i 个 数 结 尾 的 等 差 数 列 的 个 数 属性:从前i个数中选,以第i个数结尾的等差数列的个数 属性:从前i个数中选,以第i个数结尾的等差数列的个数
状
态
计
算
:
状态计算:
状态计算:
因
为
题
目
要
求
是
连
续
的
,
所
以
f
[
i
]
的
数
量
只
与
f
[
i
−
1
]
有
关
因为题目要求是连续的,所以f[i]的数量只与f[i-1]有关
因为题目要求是连续的,所以f[i]的数量只与f[i−1]有关
当 f [ i ] − f [ i − 1 ] = = f [ i − 1 ] − f [ i − 2 ] 时 当f[i] - f[i-1] == f[i-1] - f[i - 2]时 当f[i]−f[i−1]==f[i−1]−f[i−2]时
f [ i ] = f [ i − 1 ] + 1 ; f[i] = f[i - 1] + 1; f[i]=f[i−1]+1;
因
为
这
个
时
候
我
们
有
两
种
情
况
,
一
种
直
接
接
在
f
[
i
−
1
]
后
,
因为这个时候我们有两种情况,一种直接接在f[i-1]后,
因为这个时候我们有两种情况,一种直接接在f[i−1]后,
一
种
把
所
有
以
n
u
m
s
[
i
−
1
]
结
尾
的
等
差
数
列
的
第
一
个
数
去
掉
,
一种把所有以nums[i-1]结尾的等差数列的第一个数去掉,
一种把所有以nums[i−1]结尾的等差数列的第一个数去掉,
接
上
f
[
i
]
,
这
种
情
况
一
定
满
足
要
求
接上f[i],这种情况一定满足要求
接上f[i],这种情况一定满足要求
class Solution {
public:
int numberOfArithmeticSlices(vector<int>& nums) {
int n = nums.size();
vector<int>f(n+1, 0);
int res = 0;
int f1 = 0, f2 = 0;
for(int i = 3; i <= n; i ++){
if(2 * nums[i-2] == nums[i-1] + nums[i-3]){
f[i] = f[i-1] + 1;
}
}
for(int i = 1; i <= n; i++) res += f[i];
return res;
}
};