题解 | #合唱队#

合唱队

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

#不是二分查找的问题,是需要辅助数组保存之前dp得到的结果
#二分查找在查找那一步进行了简化,但是其实更重要的是换了思路

def  maxInc(height):
    n = len(height)
    dp = [1]*n
    #维护一个虚拟递增序列
    que = [height[0]]
    for i in range(1,n):
        if height[i]>que[-1]:
            que.append(height[i])
            dp[i] = len(que)
        #把新值维护到这个递增序列中它能够大于前面所有值的最大位置
        #1.大于最后值,append 2.大于pos-1,小于下标为pos的值,替换pos
        #que长度为递增子序列的最大长度
        #下标i对应的值为 递增序列能包含i+1个数,长度能达到i+1所需要越过的门槛
        #que中维护的是 一个最低代价的达到各递增序列长度的门槛值
        else:
            pos=0
            while que[pos]<height[i]:
                pos +=1
            que[pos] = height[i]
            dp[i]= pos+1
    return dp   
    
while  True:
    try:
        n = int(input())
        height = list(map(int,input().split()))
        inc = maxInc(height)
        dec = maxInc(height[::-1])[::-1]
        max_len = 0
        for i in range(n):
            if max_len< inc[i]+dec[i]-1:
                max_len= inc[i]+dec[i]-1
        
        print(n-max_len)

    except:
        break
全部评论
厉害
点赞 回复 分享
发布于 04-29 12:10 辽宁
还是你讲的透彻!看了半天二分法没看懂啥意思,你这个一看就懂了!
点赞 回复 分享
发布于 2023-08-08 20:21 江苏
看懂了,很厉害
点赞 回复 分享
发布于 2023-03-04 19:24 湖北
如果输入的是150 160 200 170 180 190 ,没考虑到会将门槛一直往后延,最后递增的吗,输出结果是1
点赞 回复 分享
发布于 2022-07-27 16:53
优秀,maxInc函数中的else后面的代码简直是点睛之笔,在题解中看了很多,但是基本都是卡在这里,直到看到楼主的题解,才是眼前一亮
点赞 回复 分享
发布于 2022-05-02 02:36

相关推荐

10-09 17:17
已编辑
门头沟学院 Java
活泼的代码渣渣在泡池...:同学你好,我也是学院本,后天要面这个亚信科技,是实习,请问问题都啥样呀,我项目就做了网上的,这是第一次面试
投递多益网络等公司10个岗位
点赞 评论 收藏
分享
09-17 10:53
四川大学 C++
牛客91242815...:会写标书没有任何卵用,鉴定为横向垃圾导师的受害者
点赞 评论 收藏
分享
评论
15
10
分享

创作者周榜

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