问题描述
已知一个序列,要求它的最长上升子序列
例子:[1,3,2,4,5,8,7]
的一个子序列是 [1,4] ,[1] 也是一个子序列
最长上升子序列,即序列中的元素成递增,比如 [1,2,4,5,7] 为上述例子的最长上升子序列
求解思路
已知目标序列nums,求nums的最长上升子序列,设定seq[i]
为【seq[i]表示nums[]数组中,长度为i+1的上升子序列的最小结尾数字】
- 初始化序列seq,长度为1,即
seq = {nums[0]}
,目前已知长度为1的结尾元素是第一个元素 - 按照顺序遍历nums,对nums中每个元素,
在seq中找到第一个大于nums[i]的元素
,替换该元素(如果nums[i]是最大的,则加到seq末尾而不是替换) - 最后seq的长度就是最长上升子序列的长度
为什么可以替换?
先证明一个定理:seq一定有序,且递增
seq有序的证明
seq[i]表示nums[]数组中,长度为i+1的上升子序列的最小结尾数字
- 因为
seq[i]
表示 长度为i
的所有上升子序列中,最小的结尾是seq[i]
- 那么我们假设存在
seq[i] > seq[j]
且