一、等差数列的划分
1、题目解析
2、算法原理
a状态表示方程
经验+题目要求
我们假设:dp[i]表示以i位置为结尾的所有子数组中有多少个等差数列
b状态转移方程
小技巧:根据最近的一步划分问题。
注意我们的状态表示方程是:
如果i节点与前面的节点构成等差数列,那么dp[i]的值就相当于在第i-1节点所有的测厚规内功案例上加上了c这么一个可能性,所以构成等差数列的情况下dp[i]=dp[i-1]+1
又根据等差数列的性质可以得出,nums[i]-nums[i-1]==nums[i-1]-nums[i-2]就可以判断出第i,i-1,i-2这三位构成等差数列。
所以可得状态转移方程:dp[i]表示以i位置为结尾的所有子数组中有多少个等差数列
c初始化
初始化需要解决访问边界问题,我们的式子中出现了i-2,所以我们至少要初始化前两个节点。
dp[0]和dp[i]无法构成等差数列,所以赋值为0。
d填表顺序
从左往右填写
e返回值
返回dp表所有节点的和
3、代码编写
class Solution {
public:
int numberOfArithmeticSlices(vector<int>& nums) {
int n=nums.size();
vector<int> dp(n,0);
int sum=0;
for(int i=2;i<n;i++){
dp[i]=nums[i]-nums[i-1]==nums[i-1]-nums[i-2]?dp[i-1]+1:0;
sum+=dp[i];
}
return sum;
}
};