题解 | #信封嵌套#

信封嵌套

http://www.nowcoder.com/practice/25fe1fc89c4c4e82bbc63df04bc6ca30

补一个python3答案:

方法:

  1. 按宽递增排序后,求长的最长严格上升子序列,同时要求宽不相等

注意:为保证宽不相等,可以使等宽区域内按长逆序排列,这样严格上升子序列在每组宽中只能取一个长,例:

输入排序前:
[[3, 4], [2, 3], [4, 5], [1, 3], [2, 2], [3, 6], [1, 2], [3, 2], [2, 4]]
排序后:
[[1, 3], [1, 2],
 [2, 4], [2, 3], [2, 2], 
 [3, 6], [3, 4], [3, 2], 
 [4, 5]
 ]

python3代码:

# 按宽递增排序后,求长的最长严格上升子序列,同时宽不相等(等宽区域内按长逆序排列即可)

def maxIncSub(arr,col=1):
    # @arr 传入数组
    # @col 按第col列求
    # @return 返回最长严格上升子序列的长度
    n=len(arr)
    dp=[1]*n
    for i in range(1,n):
        for j in range(i):
            if arr[j][col]<arr[i][col]:
                dp[i]=max(dp[i],dp[j]+1)
    return max(dp)


n=eval(input())
letters=[]
for _ in range(n):
    letters.append(list(map(int,input().split())))

# 先按长逆序,后按宽正序,即可使等宽区域内按长逆序排列
letters.sort(key=lambda x:x[1],reverse=True) # O(nlogn)
letters.sort(key=lambda x:x[0]) # 按宽排序 O(nlogn)

print(maxIncSub(letters,1))

全部评论

相关推荐

01-02 00:50
三峡大学 Java
程序员牛肉:这简历一出手就离失业不远了。 作为一家公司来讲,我如果要招日常实习生,那我对实习生最基本的要求就是要能干活,毕竟你就待三四个月,谁会留心培养你? 那么除了院校之外,最重要的就是项目和实习了。没有实习的话项目就好好搞。 但是你说你这个项目吧:课程作业管理系统和TMS运输管理系统。这两个基本就和闹着玩差不多。 你作为一个想要应聘Java开发实习生的人,对后端的理解还仅仅停留在:“使用mapper和sql映射”,“使用SQL进行多表调用”,“基于MySQL简历表结构”,“基于Spring boot完成CURD操作”这种玩具上......... 找不到后端实习的
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务