
7-25 最长上升子序列
初始化一个空数组 遍历序列中的每个元素 最终, 读取输入:首先读取输入的序列长度 初始化 遍历每个元素:对于序列中的每个元素 更新 输出结果:最终
发布日期:2021-05-10 23:56:03
浏览次数:29
分类:精选文章
本文共 817 字,大约阅读时间需要 2 分钟。
为了解决这个问题,我们需要找到给定序列中的最长上升子序列的长度。上升子序列是指一个序列中的元素严格递增。
方法思路
我们可以使用二分查找来高效地解决这个问题。具体步骤如下:
tail
,用于记录当前最长上升子序列的末端值。num
: - 使用二分查找找到
num
在tail
中的插入位置pos
。 - 如果
pos
等于tail
的长度,说明num
比所有当前末端值大,直接将num
添加到tail
的末尾。 - 否则,将
tail
中位置pos
的元素替换为num
。
tail
的长度即为最长上升子序列的长度。这种方法的时间复杂度为 O(n log n),能够高效处理较大的输入规模。
解决代码
import bisectn = int(input())a = list(map(int, input().split()))tail = []for num in a: pos = bisect.bisect_right(tail, num) if pos == len(tail): tail.append(num) else: tail[pos] = numprint(len(tail))
代码解释
n
和序列 a
。tail
数组:用于记录最长上升子序列的末端值。num
,使用 bisect.bisect_right
方法找到其在 tail
中的插入位置 pos
。tail
数组:根据插入位置 pos
更新 tail
,使得 tail
中始终保持最长上升子序列的末端值。tail
的长度即为最长上升子序列的长度。这种方法利用二分查找优化了时间复杂度,能够在较短时间内处理大规模输入,确保了算法的高效性。
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2025年05月08日 14时07分12秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
PS快速美白照片
2019-03-15
ubuntu 16.04 镜像下载
2019-03-15
CUDA9.1、cuDNN7在Ubuntu16.04上的安装
2019-03-15
微信小程序云开发:怎么删除云函数?已解决
2019-03-15
什么是句柄(经典)
2019-03-15
第一次被黑
2019-03-15
PyCharm配置anaconda环境
2019-03-15
修改linux 系统自带日志系统systemd-journald && 参数
2019-03-15
Redis工具类
2019-03-15
淘宝而已,随手就爬,保姆级教程带你装X带你飞!!!
2019-03-15
SpringBoot与缓存(JSR-107、Spring缓存抽象)
2019-03-15
微服务之Gateway实战讲解,小白必备哦!
2019-03-15
ERROR 总结
2019-03-15
C语言—— 符号函数
2019-03-15
蓝桥杯Java 试题 E: 排序
2019-03-15
钞票最优解
2019-03-15
查找最小值栈的O(1)
2019-03-15