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”的求解思路与算法示例

LeetCode 446. Arithmetic Slices II - Subsequence

《LeetCode之每日一题》:120.等差数列划分