最长递增子序列

方法一,转为求公共子序列
先对原序列进行排序
然后用对原序列和新序列求其最长公共子序列
所得即原序列的最长非递减子序列
注意,由于所求出来的是最长非递减子序列,所以可能和所要求的不一样,慎用

而且下面所示的代码用的是递归的方法来实现的,时间复杂度和空间复杂度都是O(2^N),真要实现的时候最好采用动态归化+滚动数组的方法

 

实现代码:

 

 

方法二:
方法二就是使用动态归化的方法
设L[i]为以第i个元素结尾的最长递增子序列的长度
最后在所有L[i]中取MAX即为所求 

 

 

方法三:
方法三和方法二类似,也是使用动态归化的方法
但不同之处是,使用L[i]表示,前i个元素中的最长递增子序列的长度
而且使用labels[i].pos表示,由i个元素组成的最长递增子序列的最后一个元素的位置,而且是所有最后一个元素中最小的一个
这样,其实会导致 i < j的时候 array[ labels[i].pos ] < array [ labels[j].pos ],即array[labels[i].pos]是一个单调递增函数
所以可以使用二分查找的方法,来找到第一个小于当前元素array[i]的array[ labels[i].pos ]的最大的i的位置

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值