// 递推, 每个数除了第一个,都可形成长度为2的序列
// 如果差值和之前相同, 那么序列加一, 否则长度为2
// 倒着找最长的, 每段长度L的序列数为(L - 2) * (L - 1) / 2
class Solution {
public:
int numberOfArithmeticSlices(vector<int>& nums) {
int n = nums.size();
vector<int> dp(n);
if (n <= 2) return 0;
dp[0] = 1;
dp[1] = 2;
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] = 2;
}
}
int pre = -1;
int cnt = 0;
for (int i = n - 1; i > 1; i --) {
if (dp[i] > pre && dp[i] > 2) {
cnt += (dp[i] - 2) * (dp[i] - 1) / 2;
}
pre = dp[i];
}
return cnt;
}
};
leetcode 413 等差数列划分 动态规划 简单递推
最新推荐文章于 2022-04-10 01:42:22 发布