896. 最长上升子序列 II

摘要
Title: 896. 最长上升子序列 II
Tag: 贪心、二分、LIS模型
Memory Limit: 64 MB
Time Limit: 1000 ms

Powered by:NEFU AB-IN

Link

896. 最长上升子序列 II

  • 题意

    给定一个长度为 N 的数列,求数值严格单调递增的子序列的长度最长是多少。

  • 思路

    贪心考虑,就像单调栈一样,一直维护一个递增的序列,只不过在来了一个比较小的数时,需要用它替代数组中对应的数
    比如 1 3 7 8,比如这个数是4,那么就可以通过二分,将序列更改为 1 3 4 8


    比如 896
    可以看出,栈中的队列不一定是真实存在的,这种方法求出来的只有栈的size是有效的

  • 代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    '''
    Author: NEFU AB-IN
    Date: 2022-03-07 14:42:36
    FilePath: \ACM\Acwing\896.py
    LastEditTime: 2022-03-07 15:03:36
    '''
    N = int(1e5 + 10)
    a = [0] * N
    dp = []


    def find(x):
    l, r = 0, len(dp) #当列表一开始没有值时,将右边界设为 len(dp),不减1,防止越界
    while l < r:
    mid = l + r >> 1
    if dp[mid] >= x:
    r = mid
    else:
    l = mid + 1
    return r


    n = int(input())
    a[1:] = list(map(int, input().split()))

    for i in range(1, n + 1):
    # pos = bisect_left(dp, a[i])
    pos = find(a[i])
    if pos == len(dp):
    dp.append(a[i])
    else:
    dp[pos] = a[i]

    print(len(dp))
使用搜索:谷歌必应百度