方法一,转为求公共子序列
先对原序列进行排序
然后用对原序列和新序列求其最长公共子序列
所得即原序列的最长非递减子序列
注意,由于所求出来的是最长非递减子序列,所以可能和所要求的不一样,慎用
而且下面所示的代码用的是递归的方法来实现的,时间复杂度和空间复杂度都是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的位置