题解 | #会议室问题#

最长递增子序列

http://www.nowcoder.com/questionTerminal/9cf027bf54714ad889d4f30ff0ae5481

class Solution:
    def lengthOfLIS(self, nums: List[int]) -> int:
        #dp[i] = max(dp[i-k] + 1) for k in range(0, i)
        #last = k
        n = len(nums)
        dp = [0]*n
        last = [-1]*n#记录上一个位置
        max_n = 0
        max_i = None
        for i in range(n):
            mk = None
            for k in range(i):
                if nums[k] < nums[i]:
                    if mk is None:
                        mk = k
                    else:
                        if dp[k] > dp[mk]:
                            mk = k
                        elif dp[k] == dp[mk]:
                            if nums[k] < nums[mk]:
                                mk = k
            if mk is None:
                dp[i] = 1
                #last[i] = -1
            else:
                dp[i] = dp[mk] + 1
                last[i] = mk
            
            #max_n = max(max_n, dp[i])
            if max_i is None:
                max_n = dp[i]
                max_i = i
                continue

            if max_n < dp[i]:
                max_n = dp[i]
                max_i = i
            elif max_n == dp[i]:
                if nums[i] < nums[max_i]:
                    max_n = dp[i]
                    max_i = i
        #print(max_n, max_i)
        result = []
        result.append(nums[max_i])
        while True:
            max_i = last[max_i]
            if max_i == -1:
                break
            result.append(nums[max_i])
        result.reverse()
        print(max_n, result)#最长的长度,以及字典序最小的子序列
        return max_n

全部评论

相关推荐

八极星:有什么不能问的,(/_\),这又不是多珍贵的机会,你有什么可失去的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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