来自 https://leetcode.com/problems/russian-doll-envelopes/

You have a number of envelopes with widths and heights given as a pair of integers (w, h). One envelope can fit into another if and only if both the width and height of one envelope is greater than the width and height of the other envelope.

What is the maximum number of envelopes can you Russian doll? (put one inside other)

Example:

Given envelopes = [[5,4],[6,4],[6,7],[2,3]], the maximum number of envelopes you can Russian doll is 3 ([2,3] => [5,4] => [6,7]).

这个题目是最长子序列的变形;最长子序列可以参考https://en.wikipedia.org/wiki/Longest_increasing_subsequence

本题目的解法:

1. 先将长方形按照宽排序,如果宽度一样, 按照高度降序排列,即 wi < wj or wi == wj && hi > hj; 这样得到的序列,从宽度考虑,前面的肯定可以放入后面的;对于wi == wj && hi > hj是因为在宽度一致的情况下,将更高的放在前面,可以保证后面根据高度查找最长子序列的时候,将这种组合排除;

2. 然后根据高度查找可以嵌套的最长子序列即可;

func maxEnvelopes(envelopes [][]int) int {

sort.Sort(byShape(envelopes))

m := make([]int, len(envelopes)+1, len(envelopes)+1)

L := 0

for i, a := range envelopes {

lo, hi := 1, L

for lo <= hi {

mid := (lo + hi) / 2

b := envelopes[m[mid]]

if b[1] < a[1] {

lo = mid + 1

} else {

hi = mid - 1

}

}

m[lo] = i

if L < lo {

L = lo

}

}

return L

}

type byShape [][]int

func (a byShape) Len() int {

return len(a)

}

func (a byShape) Less(i, j int) bool {

if a[i][0] != a[j][0] {

return a[i][0] < a[j][0]

}

return a[j][1] < a[i][1]

}

func (a byShape) Swap(i, j int) {

a[i], a[j] = a[j], a[i]

}

java 套娃_【leetcode编程题目354】俄罗斯套娃相关推荐

  1. java 套娃_论“套娃”

    轮"套娃"的实力,还是应该数得上那群"种花家"的"流氓兔",钓上来"鹰酱",实现三个愿望,"我要小钱钱和小钱钱 ...

  2. java套娃_[GXYCTF2019]禁止套娃

    0x00 知识点 无参数RCE eval($_GET['exp']); 1.利用超全局变量进行bypass,进行RCE 2.进行任意文件读取 形式: if(';' === preg_replace(' ...

  3. java程序弊端_面向对象编程的弊端是什么?

    信仰万物皆对象,习惯性Thinking in OOP的话,有可能会限制住自己解决实际问题的思路. 曾经面试过某java候选人,我出了道其实很简单的算法题. 结果候选人上来就去定义对象.属性.方法.接口 ...

  4. java面向对象程序_面向对象编程基础(java)

    面向对象编程基础 1.1 面向对象概述 在程序开发初期,大家使用的是结构化开发语言,也就是面向过程(opp),但随着市场需求剧增,软件的规模也越来越大,结构化语言的弊端也暴露出来. 开发周期无休止的拖 ...

  5. Java套接字Socket编程--TCP参数

    在Java的Socket中,主要包含了以下可设置的TCP参数. 属性 说明 默认值 SO_TIMEOUT 对ServerSocket来说表示等待连接的最长空等待时间; 对Socket来说表示读数据最长 ...

  6. java 变量锁_并发编程高频面试题:可重入锁+线程池+内存模型等(含答案)

    对于一个Java程序员而言,能否熟练掌握并发编程是判断他优秀与否的重要标准之一.因为并发编程是Java语言中最为晦涩的知识点,它涉及操作系统.内存.CPU.编程语言等多方面的基础能力,更为考验一个程序 ...

  7. java套娃_Java也有俄罗斯套娃,内部类剖析

    在我们日常Java编程中,内部类用到的相对比较少,但是也有必要了解下.注:本篇测试Jdk版本为1.7 1.内部类简述 在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类. ...

  8. 新手java安装教程_给编程小白的java JDK安装教程

    对刚开始学习编程的新手朋友们来说,安装开发环境可谓是一件头疼的事了,为了不让刚准备入门java的朋友还没写出自己的Hello World就被安装开发环境劝退,所以本篇文章诞生了. 下载JDK 打开浏览 ...

  9. Java三行情书_函数式编程思维在三行代码情书中的应用

    函数式编程概述 如今主流的编程语言,函数式编程范式或多或少都融入其中成了"标配",或者说主流语言都在进行函数式方面的扩充,这是一个大趋势.以Java为例,随着 Lambda块 和 ...

最新文章

  1. springboot templates读取不到_整合spring mvc + mybatis,其实很简单,spring boot实践(5)
  2. Daily Scrum 10.24
  3. 169. Majority Element
  4. java文件和xml文件_用Java分割大型XML文件
  5. Everyday is an Opportunity
  6. 这样的开源方式,你喜欢吗?
  7. 多个微服务的接口依赖如何测试_一文看懂微服务
  8. 惠普计算机硬盘序列号怎么查询,硬盘序列号怎么看 【设置办法】
  9. 前端开发项目——企业员工管理系统(前后端分离)
  10. vue 设置表单必填项
  11. 数据库系统原理与应用教程(031)—— MySQL 的数据完整性(四):定义外键(FOREIGN KEY)
  12. open函数里的newline
  13. 迁移学习具体场景与方法
  14. 将机械硬盘换成固态硬盘的装机过程
  15. 小程序服务器还得备案域名,小程序服务器要不要域名备案
  16. [统计学理论基础] 方差 协方差 标准差
  17. 使用 wpa_supplicant
  18. [Power BI] 认识Power Query和M语言
  19. 比较 Java 枚举成员:== 或 equals()?
  20. Learning to See in the Dark阅读札记

热门文章

  1. model.fit() 参数详解【TensorFlow2入门手册】
  2. MATLAB中rand,randi,randn函数,及rand('state',0)和rand('seed',0)产生随机种子详解
  3. Python编程基础:第六节 math包的基础使用Math Functions
  4. 从源码角度深入分析log4j配置文件使用
  5. linux下的%zu
  6. 短视频风口创业不容易,您信吗?
  7. 易开发创始人潘俊勇:这些年我遇到的那些坑
  8. 郑风田:老美哪些地儿值得咱们?
  9. hadoop入门-在windows上安装,测试hadoop
  10. 深入理解分布式技术 - 分布式缓存总结回顾