力扣354.俄罗斯套娃信封问题——python

我们采用DP的方法进行解决,首先我们肯定要进行排序,我们首先会按照第一个数进行排序,但是相同的怎么办?我们在对相同的第一个的进行倒序排序,排序后,信封宽度是升序,必然是后面的信封套前面的信封。按h降序排列是为了找最长递增子序列时防止同一宽度的信封被选择多次。。之后我们通过循环进行获得最大值。

        if not envelopes:
            return 0
        N = len(envelopes)
        envelopes.sort(key=lambda x: (x[0], -x[1]))
        res = 0
        dp = [1] * N
        for i in range(N):
            for j in range(i):
                if envelopes[j][1] < envelopes[i][1]:
                    dp[i] = max(dp[i], dp[j] + 1)
        return max(dp)

我们也可以用二分查找进行完成该题目

        if not envelopes:
        return 0
        envelopes.sort(key=lambda x:(x[0],-x[1]))
        n=len(envelopes)
        stack=[]
        for i in range(n):
            h=envelopes[i][1]            
            if not stack or stack[-1]<h:
                stack.append(h)
            else:
                index=bisect.bisect_left(stack,h)
                stack[index]=h
        return len(stack)

我们找出这个信封该有的位置,来获取最大值,如下面的例子
例如数组为[2,5,3,4]:
当遍历到2时,数组arr为空,加入首元素变为[2],当遍历到5时,arr中存储的数为[2,5],当遍历到3时,target=3,在arr中二分查找可插入的位置index,此位置上的数arr[index]>=taget,将index位置上的数替换为target,arr=[2,3],而后面的数num可能出现target<=num<=arr[index],使得子序列更长,当遍历到4时,arr变为[2,3,4],就算出来了最大值。

你可能感兴趣的:(力扣,python,leetcode)