编程之美 最长递增子序列 LIS

1. O(N*logN) 解法

先对序列排序, 然后寻找两个序列的最长公共子序列

 

2. O(N*N) 的动态规划解法

令 LIST[i] 表示以 i 为结尾的最长子序列的长度, 那么 LIST[J] = MAX(LIST[I]+1), J > I

 

3. O(N*logN) 的动态规划解法 (需要 O(N) 的空间复杂度)

设置一个数组 B[], 记录 B[] 记录长度为 i 的 LIS 的末尾元素, 向 B 中插入数据使用二分插入, 即可实现 N*logN 的时间复杂度

方法很是奇妙

 

posted @ 2013-12-19 12:04  SangS  阅读(242)  评论(0编辑  收藏  举报