题解 | #合唱队#

合唱队

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

相关推荐

去B座二楼砸水泥地:不过也可以理解,这种应该没参加过秋招
点赞 评论 收藏
分享
牛客618272644号:佬携程工作怎么样,强度大吗
点赞 评论 收藏
分享
13 9 评论
分享
牛客网
牛客企业服务