AcWing 896. 最长上升子序列 II
原题链接
中等
作者:
Sondottt
,
2024-12-04 00:39:52
,
所有人可见
,
阅读 2
思路:基于贪心的思想,如果一个子序列里面,前面的数越小,那么这个子序列越有‘潜力’最长。
于是通过二分,找到第一个小于他的数,落在他后面
1.注意两种二分写法的区别 :到底是r = mid-1还是mid ,
将 l代成0 ,r 代成1 进去检验,最后会不会形成死循环。
Q2.两种二分写法为什么最后赋值不同?
A:第一种写法 : l最终指向的是第一个大于等于nums[i]的数。
第二种写法: r最终指向的是最后一个小于nums[i] 的数
Python 代码 写法一
N = 100010
if __name__ == '__main__':
n = int(input())
nums = list(map(int,input().split()))
q = [0 for _ in range(n+1)]
len = 0
for i in range(n):
l = 0
r = len
while l<r:
mid = (l+r)//2
if q[mid]>=nums[i]:
r = mid
else:
l = mid + 1
q[l] = nums[i]
if l+1>len:
len += 1
print(len)
Python 代码 写法二
N = 100010
if __name__ == '__main__':
n = int(input())
nums = list(map(int,input().split()))
q = [0 for _ in range(n+1)]
len = 0
for i in range(n):
l = 0
r = len
while l<r:
mid = (l+r+1)//2
if q[mid]>=nums[i]:
r = mid-1
else:
l = mid
q[r+1] = nums[i]
if r+1>len:
len += 1
print(len)