leetcode 446. 等差数列划分 II - 子序列

本文介绍了一种通过动态规划(DP)和哈希技术解决关于整数序列中差值出现频次的问题。难点在于状态表示的扩展和离散化的巧妙应用。通过定义f(i,j)表示以i为结尾且差值为j的子序列数量,文章提供了详细的步骤和代码实现,以减少哈希搜索次数,提高效率。

题目链接

算法 DP+哈希

复杂度O(n^2)

本题难点

1.dp的状态表示
2.离散化难以想到
3.注意会卡常

序列dp一般第一维表示前i个数符合的某种条件
本题第一维表示序列前i个数,由题知一维不够用,因此添加到二维,由等差推出第二维用差值

1.所以推出f(i,j) 表示以 i 为结尾的差值为 j 的子序列的个数(包括长度为 2 的)。

2.数组值的范围比较大,但数组个数较小,因此必须离散化,新的二维数组表示方法 vector<unordered_map<LL,int>>f(n+1);

3.减小卡常,即减少哈希搜索次数,详细见代码

class Solution {
public:
    typedef long long LL;
    int numberOfArithmeticSlices(vector<int>& nums) {
        int n=nums.size();
        int res=0;
        vector<unordered_map<LL,int>>f(n+1);
        for(int i=0;i<n;i++)
        {
            for(int k=0;k<i;k++)
            {
                LL j=(LL)nums[i]-nums[k];
                auto it=f[k].find(j);
                int t=0;
                if(it!=f[k].end())
                {
                    t=it->second;
                    res+=t;
                }
                f[i][j]+=t+1;
            }
        }
        return res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_WAWA鱼_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值