LeetCode-354-俄罗斯套娃问题

第一次做困难的题,我感觉想出这种扑克牌求最长递增子序列算法思想的人简直yyds,respect!

一. 题目描述

在这里插入图片描述

二. 解法描述(扑克牌法求最长递增子序列)

在这里插入图片描述

  1. 首先用Arrays类的sort方法对这个信封二维数组进行排序,自己定义排序规则的话,要自己实现java.util.Comparator接口,重写compare方法。当o1信封的宽等于o2信封的宽时,如果O2的高度大于O1的高度,则返回正值,则说明O1在O2的前面,如果两者宽度不相等,谁宽小谁在前面。(宽度以升序排列,高度以降序排列,如下图所示)
    在这里插入图片描述
  2. 然后就是对高度进行求最长递增子序列的长度。
    在这里插入图片描述
    扑克牌法求最长递增子序列的思想,就是依此从左到右读取扑克牌,每一堆中小的扑克牌才能放到大的扑克牌上面,如果找不到可放置的堆,则新建堆,当遇到有多个堆可以放置时,选择最左的那个堆放置(即求左边界),由图可知,堆的个数就是最长递增子序列的长度。
    在这里插入图片描述
  3. piles代表的是堆数,最后最长递增子序列的长度就是堆数大小。top数组上存放的是每一堆上的最上面的那个数字(即当前堆最小的数字),可知top数组是按照从小到大的顺序排列的,poker代表当前要放置的数字,用二分搜索法搜索top数组,使用的是左闭右开的左边界法。如果left=piles,说明poker大于目前top数组中的所有数,则新建堆。最后把poker放入最左边的堆中。
  4. 动态规划法后续补充~
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值