leetcode 446 等差数列划分2 子序列 dp思维

这题和之前做过的那题不同的是 那道题是连续的,而这道题是子序列 可以不连续
如果传统的设dp[i]为 以num[i]结尾的等差数列的个数,则当要从j(jdp[i][j]要定义为 以num[i]结尾的差值为j的等差子序列的个数, 可以知道dp[i][d]=求和dpjd(d 同时还有一个问题,若dpi的元素是个数组则下标d要开的很大很大,必然是不行的,所以需要用哈希表来替代。
综上这题关键是思维要搞清楚,升维的地方很重要,把长度为3的子序列退化为长度为2的子序列也很重要,用哈希表也很重要,学习了
官方代码:

class Solution {
public:
    int numberOfArithmeticSlices(vector<int> &nums) {
        int ans = 0;
        int n = nums.size();
        vector<unordered_map<long long, int>> f(n);
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < i; ++j) {
                long long d = 1LL * nums[i] - nums[j];
                auto it = f[j].find(d);
                int cnt = it == f[j].end() ? 0 : it->second;
                ans += cnt;
                f[i][d] += cnt + 1;
            }
        }
        return ans;
    }
};

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/arithmetic-slices-ii-subsequence/solution/deng-chai-shu-lie-hua-fen-ii-zi-xu-lie-b-77pl/
来源:力扣(LeetCode)

你可能感兴趣的:(leetcode,算法)