「力扣」第 354 题:俄罗斯套娃


Python 代码:

from typing import List


class Solution:
    def maxEnvelopes(self, envelopes: List[List[int]]) -> int:
        size = len(envelopes)
        # 特判
        if size < 2:
            return size

        # 对第一列排序,按照宽度排序
        # 【特别注意】当宽度相等的时候,按照高度降序排序
        # 以避免 [[11, 3], [12, 4], [12, 5], [12, 6], [14, 6]] 这种情况发生
        # 正确排序 [[11, 3], [12, 6], [12, 5], [12, 4], [14, 6]]
        envelopes.sort(key=lambda x: (x[0], -x[1]))

        # print(envelopes)
        tail = [envelopes[0][1]]

        for i in range(1, size):
            target = envelopes[i][1]
            if target > tail[-1]:
                tail.append(target)
                continue

            left = 0
            right = len(tail) - 1

            while left < right:
                mid = (left + right) >> 1
                if tail[mid] < target:
                    left = mid + 1
                else:
                    right = mid
            tail[left] = target
        # print(tail)
        return len(tail)


if __name__ == '__main__':
    envelopes = [[4, 5], [4, 6], [6, 7], [2, 3], [1, 1]]
    envelopes = [[30, 50], [12, 2], [3, 4], [12, 15]]
    envelopes = [[1, 3], [3, 5], [6, 7], [6, 8], [8, 4], [9, 5]]
    solution = Solution()
    res = solution.maxEnvelopes(envelopes)
    print(res)

文章作者: liweiwei419
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 liweiwei419 !
评论
 上一篇
「力扣」第 376 题:摆动序列 「力扣」第 376 题:摆动序列
「力扣」第 376 题:摆动序列 提示:1、状态机;2、贪心。 链接 题解链接 一个序列,它的相邻数字的大小关系是升序降序轮流交替的(最初可以是升序,也可以是降序),就称为wiggle sequence。比如[1, 7, 4, 9,
下一篇 
「力扣」第 343 题:整数拆分 「力扣」第 343 题:整数拆分
「力扣」第 343 题:整数拆分传送门:343. 整数拆分。 给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。 示例 1: 输入: 2 输出: 1 解释: 2 = 1 + 1, 1
  目录