贪心法求解LIS(最长上升子序列)问题的证明

问题描述

已知一个序列,要求它的最长上升子序列

例子:[1,3,2,4,5,8,7]

的一个子序列是 [1,4] ,[1] 也是一个子序列

最长上升子序列,即序列中的元素成递增,比如 [1,2,4,5,7] 为上述例子的最长上升子序列

求解思路

已知目标序列nums,求nums的最长上升子序列,设定seq[i]为【seq[i]表示nums[]数组中,长度为i+1的上升子序列的最小结尾数字】

  1. 初始化序列seq,长度为1,即seq = {nums[0]},目前已知长度为1的结尾元素是第一个元素
  2. 按照顺序遍历nums,对nums中每个元素,在seq中找到第一个大于nums[i]的元素,替换该元素(如果nums[i]是最大的,则加到seq末尾而不是替换)
  3. 最后seq的长度就是最长上升子序列的长度

为什么可以替换?

先证明一个定理:seq一定有序,且递增

seq有序的证明

seq[i]表示nums[]数组中,长度为i+1的上升子序列的最小结尾数字

  1. 因为seq[i] 表示 长度为i的所有上升子序列中,最小的结尾是seq[i]
  2. 那么我们假设存在 seq[i] > seq[j]
  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值