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)

Note:
Rotation is not allowed.

Example:

Input: [[5,4],[6,4],[6,7],[2,3]]
Output: 3
Explanation: The maximum number of envelopes you can Russian doll is 3 ([2,3] => [5,4] => [6,7]).

信封的嵌套问题,就像俄罗斯套娃一样,一个套一个,求能套的最多数量。

300. Longest Increasing Subsequence类似,从那题一维变成了两维。

先给信封排序,按信封的宽度从小到大排,宽度相等时,高度大的在前面。问题就简化了成了找高度数字中的Longest Increasing Subsequence。

Java: Naive

public int maxEnvelopes(int[][] envelopes) {
if(envelopes==null||envelopes.length==0)
return 0; Arrays.sort(envelopes, new Comparator<int[]>(){
public int compare(int[] a, int[] b){
if(a[0]!=b[0]){
return a[0]-b[0];
}else{
return a[1]-b[1];
}
}
});
int max=1;
int[] arr = new int[envelopes.length];
for(int i=0; i<envelopes.length; i++){
arr[i]=1;
for(int j=i-1; j>=0; j--){
if(envelopes[i][0]>envelopes[j][0]&&envelopes[i][1]>envelopes[j][1]){
arr[i]=Math.max(arr[i], arr[j]+1);
}
}
max = Math.max(max, arr[i]);
} return max;
} 

Java: Binary Search

public int maxEnvelopes(int[][] envelopes) {
if(envelopes==null||envelopes.length==0)
return 0; Arrays.sort(envelopes, new Comparator<int[]>(){
public int compare(int[] a, int[] b){
if(a[0]!=b[0]){
return a[0]-b[0]; //ascending order
}else{
return b[1]-a[1]; // descending order
}
}
}); ArrayList<Integer> list = new ArrayList<Integer>(); for(int i=0; i<envelopes.length; i++){ if(list.size()==0 || list.get(list.size()-1)<envelopes[i][1])
list.add(envelopes[i][1]); int l=0;
int r=list.size()-1; while(l<r){
int m=l+(r-l)/2;
if(list.get(m)<envelopes[i][1]){
l=m+1;
}else{
r=m;
}
} list.set(r, envelopes[i][1]);
} return list.size();
}

Python:

class Solution(object):
def maxEnvelopes(self, envelopes): def insert(target):
left, right = 0, len(result) - 1
while left <= right:
mid = left + (right - left) / 2
if result[mid] >= target:
right = mid - 1
else:
left = mid + 1
if left == len(result):
result.append(target)
else:
result[left] = target result = []
envelopes.sort(lambda x, y: y[1] - x[1] if x[0] == y[0] else \
x[0] - y[0])
for envelope in envelopes:
insert(envelope[1]) return len(result)

C++:

class Solution {
public:
int maxEnvelopes(vector<pair<int, int>>& envelopes) {
vector<int> dp;
sort(envelopes.begin(), envelopes.end(), [](const pair<int, int> &a, const pair<int, int> &b){
if (a.first == b.first) return a.second > b.second;
return a.first < b.first;
});
for (int i = 0; i < envelopes.size(); ++i) {
int left = 0, right = dp.size(), t= envelopes[i].second;
while (left < right) {
int mid = left + (right - left) / 2;
if (dp[mid] < t) left = mid + 1;
else right = mid;
}
if (right >= dp.size()) dp.push_back(t);
else dp[right] = t;
}
return dp.size();
}
};

类似题目:

[LeetCode] 300. Longest Increasing Subsequence 最长递增子序列

All LeetCode Questions List 题目汇总

  

[LeetCode] 354. Russian Doll Envelopes 俄罗斯套娃信封的更多相关文章

  1. leetCode 354. Russian Doll Envelopes

    You have a number of envelopes with widths and heights given as a pair of integers (w, h). One envel ...

  2. leetcode@ [354] Russian Doll Envelopes (Dynamic Programming)

    https://leetcode.com/problems/russian-doll-envelopes/ You have a number of envelopes with widths and ...

  3. 第十二周 Leetcode 354. Russian Doll Envelopes(HARD) LIS问题

    Leetcode354 暴力的方法是显而易见的 O(n^2)构造一个DAG找最长链即可. 也有办法优化到O(nlogn) 注意 信封的方向是不能转换的. 对第一维从小到大排序,第一维相同第二维从大到小 ...

  4. 【leetcode】354. Russian Doll Envelopes

    题目描述: You have a number of envelopes with widths and heights given as a pair of integers (w, h). One ...

  5. 354 Russian Doll Envelopes 俄罗斯娃娃信封

    You have a number of envelopes with widths and heights given as a pair of integers (w, h). One envel ...

  6. 354. Russian Doll Envelopes

    You have a number of envelopes with widths and heights given as a pair of integers (w, h). One envel ...

  7. [Swift]LeetCode354. 俄罗斯套娃信封问题 | Russian Doll Envelopes

    You have a number of envelopes with widths and heights given as a pair of integers (w, h). One envel ...

  8. [LeetCode] Russian Doll Envelopes 俄罗斯娃娃信封

    You have a number of envelopes with widths and heights given as a pair of integers (w, h). One envel ...

  9. 动态规划——Russian Doll Envelopes

    这个题大意很好理解,通过例子就能明白,很像俄罗斯套娃,大的娃娃套小的娃娃.这个题是大信封套小信封,每个信封都有长和宽,如果A信封的长和宽都要比B信封的要大,那么A信封可以套B信封,现在给定一组信封的大 ...

随机推荐

  1. Windows解决端口被占用问题

    第一种解决方法,以8080端口为例 打开命令行输入 cmd ,输入netstat -ano 会显示所有已经在运行的端口情况.PID为进程id 输入你想要查的正在占用的端口号,netstat -ano ...

  2. 4.Linq To Xml操作XML增删改查

    转自https://www.cnblogs.com/wujy/p/3366812.html 对XML文件的操作在平时项目中经常要运用到,比如用于存放一些配置相关的内容:本文将简单运用Linq TO X ...

  3. (转)python自动化测试之异常及日志

    为了保持自动化测试用例的健壮性,异常的捕获及处理,日志的记录对掌握自动化测试执行情况尤为重要,这里便详细的介绍下在自动化测试中使用到的异常及日志,并介绍其详细的用法. 一.日志 打印日志是很多程序的重 ...

  4. Linux下串口操作

    一.Linux下访问串口 串口位置:/dev/tty** 在Linux系统中,串口设备是通过串口终端设备文件来访问的,也就是通过访问/dev/ttyS0./dev/ttyS1./dev/ttyS2./ ...

  5. pycharm激活2018(终极解决办法)

    1.将“0.0.0.0 account.jetbrains.com”中的内容添加到hosts文件中,hosts路径为:C:\Windows\System32\drivers\etc 2.打开http: ...

  6. 域渗透:SPN(ServicePrincipal Names)的利用

    SPN 简介:服务主体名称(SPN:ServicePrincipal Names)是服务实例(可以理解为一个服务,比如 HTTP.MSSQL)的唯一标识符.Kerberos 身份验证使用 SPN 将服 ...

  7. OLED液晶屏幕(1)OLED液晶屏幕ssd1306驱动芯片 arduino运行 ESP8266-07可以 12f不可以

    OLED屏幕有各种形状和尺寸,但目前有两种非常受欢迎的屏幕尺寸. 1)0.96“ 2)1.3“ 他们也有2种常见的颜色 1)蓝色 2)白色 驱动OLED的芯片常用的有两种.这两种芯片有许多非常相似的设 ...

  8. LeetCode 446. Arithmetic Slices II - Subsequence

    原题链接在这里:https://leetcode.com/problems/arithmetic-slices-ii-subsequence/ 题目: A sequence of numbers is ...

  9. Redis-基础介绍

    Redis 基础介绍 一.Redis介绍 二.Redis和Memecache的不同 三.Redis的最佳应用场景: 四.Redis支持的键值类型 五.安装Redis 六.Redis启动方式 七.Red ...

  10. mysql linux上安装使用

    安装启动 安装之前可以看下系统中有没有已经安装. 查看所有软件:dpkg -l 1.查看mysql安装的版本 mysql --version 2.mysql状态 service mysql statu ...