没太看明白 [quote=引用 1 楼 FancyMouse 的回复:] 不妨设这个数列没有重复值,否则就用hashtable剔除重复值以后再来计算。 O(n)建立一个hashtable,key是每一个a[i]-1。另外做一个数组b,b[i]意义是每个元素开始的最长递增连续子序列长度。初始化所有b[i]=1。 然后对于每一个a[i],查询a[i]它自己是不是在刚才建立的hashtable里。不在的话那就不需要做什么。在的话,那就递归下去计算b[i]的实际值。并且注意用动态规划的方法来优化(不重复计算已经计算过的b) 这样由于每个b[i]顶多被计算一次,整体复杂度依然是线性。
将数据分割成2块,{} > 0 , {} < 0 那么最长连续序列有3种可能: 1 出现在{} > 0 2 出现在{} < 0 3 包含0的最长连续序列 对于大于0的数而言,可以用bitvector对数据进行O(n)时间排序,排序好后计算就简单了。 对于小于0的数而言,取反然后按1思路做 对于包含0的最长序列,其实通过前面的方法,很容易得到
不妨设这个数列没有重复值,否则就用hashtable剔除重复值以后再来计算。 O(n)建立一个hashtable,key是每一个a[i]-1。另外做一个数组b,b[i]意义是每个元素开始的最长递增连续子序列长度。初始化所有b[i]=1。 然后对于每一个a[i],查询a[i]它自己是不是在刚才建立的hashtable里。不在的话那就不需要做什么。在的话,那就递归下去计算b[i]的实际值。并且注意用动态规划的方法来优化(不重复计算已经计算过的b) 这样由于每个b[i]顶多被计算一次,整体复杂度依然是线性。
33,008
社区成员
35,326
社区内容
加载中
试试用AI创作助手写篇文章吧