题解 | #合唱队#

合唱队

http://www.nowcoder.com/practice/6d9d69e3898f45169a441632b325c7b4


import bisect


def lengthOfLIS(nums: [int], endOf):
    d = []  # 数组d[i]表示长度为i的最长上升子序列的末尾元素的最小值
    # d[i] 是关于 i 单调递增
    for i, num in enumerate(nums):
        if not d or num > d[-1]:
            d.append(num)
        else:
            pos = bisect.bisect_left(d, num)
            d[pos] = num  # num一定可以更新当前的d中的一个最小值,但可能会再后面找到更小的
        endOf[i] = len(d)


n = int(input())
hight = list(map(int, input().split()))
left, right = [1] * n, [1] * n
lengthOfLIS(hight, left)
lengthOfLIS(hight[::-1], right)
right = right[::-1]
max_band = max(l + r - 1 for l, r in zip(left, right))
print(n - max_band)



全部评论

相关推荐

点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
05-25 18:29
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务