题解 | #合唱队#

合唱队

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

import bisect #引入二分法
def hcteam(l): #定义一个函数,寻找最长的子序列
    arr = [l[0]] #定义列表,将传入函数的列表第一个元素放入当前元素
    dp = [1]*len(l) #定义一个列表,默认子序列有当前元素1,长度是传入函数的列表长度
    for i in range(1,len(l)): #从第二个元素开始查找
        if l[i] > arr[-1]: #如果元素大于arr列表的最后一个元素,就把它插入列表末尾
            arr.append(l[i])
            dp[i] = len(arr)# 获取这个元素子序列的长度
        else: # 否则,利用二分法找到比元素大的元素的位置,用新的元素替代比它大的那个元素的值,这样就能制造出一个顺序排列的子序列
            pos = bisect.bisect_left(arr, l[i])
            arr[pos] = l[i]
            dp[i] =pos+1 # 获取这个元素子序列的长度
    return dp

while True:
    try:
        n = int(input())
        sg = list(map(int,input().split()))
        left_t = hcteam(sg) #向左遍历查找子序列
        right_t = hcteam(sg[::-1])[::-1] #向右遍历查找子序列
        res = [left_t[i]+right_t[i]-1 for i in range(len(sg))] #因为左右都包含原元素,所以需要减1 ;得到各元素能得到的子序列的最大长度
        print(n-max(res)) # 源列表长度-可以生成的最长子序列长度  得到需要剔除的最小人数
    except:
        break
全部评论
天才啊,感谢注释,上面看了一堆没看懂
点赞 回复 分享
发布于 2022-05-16 22:15
强!!!
点赞 回复 分享
发布于 2022-05-07 00:46
所有 Python3 题解里好像只有这个用二分搜索,将动态规划部分的时间复杂度降低到 O(n*log(n)) 才不会 TLE 。算法很强!
点赞 回复 分享
发布于 2022-01-26 16:25
想了半天arr的意义之后终于完全理解了,太天才了。
点赞 回复 分享
发布于 2022-01-01 04:36

相关推荐

飞花断音:这个头像有点搞笑
点赞 评论 收藏
分享
牛客10001:问就是六个月,全国可飞,给钱就干
点赞 评论 收藏
分享
评论
29
13
分享

创作者周榜

更多
牛客网
牛客企业服务