LeetCode 446 等差数列划分II - 子序列[动态规划] HERODING的LeetCode之路
Posted HERODING23
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 446 等差数列划分II - 子序列[动态规划] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。
解题思路:
这与I最大的不同在于不再限制是连续序列,即只要是满足等差条都是属于等差子序列,这就完全颠覆了之前的解题方法,之前的相当于暴力的方式解决。这里需要利用到动态规划,构造等差数列最后一项和倒数第二项,用map来记录当前项以d为公差的等差子数列个数,如果找到,更新ans并更新map[i][d],没找到则只更新map[i][d],记录这两项可以构成等差数列前两项,如果后面还有满足条件构成等差数列的,就可以直接组合了,我的讲解可能不容易理解,相信你看完代码就知道了,代码如下:
class Solution {
public:
int numberOfArithmeticSlices(vector<int> &nums) {
int ans = 0;
int n = nums.size();
vector<unordered_map<long long, int>> dp(n);
// i为数列尾部,j为倒数第二个元素
for(int i = 0; i < n; i ++) {
for(int j = 0; j < i; j ++) {
// 公差
long long d = 1LL * nums[i] - nums[j];
// 查找之前是否成等差数列
auto it = dp[j].find(d);
int temp = 0;
if(it != dp[j].end()) {
temp = it -> second;
}
ans += temp;
// 更新等差数列个数
dp[i][d] += 1 + temp;
}
}
return ans;
}
};
以上是关于LeetCode 446 等差数列划分II - 子序列[动态规划] HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章
446 Arithmetic Slices II - Subsequence 算数切片之二 - 子序列
LeetCode 313. 超级丑数(最小堆动态规划)/413. 等差数列划分/167. 两数之和 II - 输入有序数组
2022-02-06:等差数列划分 II - 子序列。 给你一个整数数组 nums ,返回 nums 中所有 等差子序列 的数目。 如果一个序列中 至少有三个元素 ,并且任意两个相邻元素之差相同,则称
数据结构与算法之深入解析“等差数列划分II”的求解思路与算法示例