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

被折叠的 条评论
为什么被折叠?



