题目描述
给n个信封的长度和宽度。如果信封A的长和宽都小于信封B,那么信封A可以放到信封B里,请求出信封最多可以嵌套多少层。
输入描述:
输出包含多行,第一行包括一个整数,代表信封的个数n。接下来n行,每行两个整数li和wi,代表信封的长度和宽度。
输出描述:
输出包括一行,代表信封最多嵌套多少层。
示例1
输入
9
3 4
2 3
4 5
1 3
2 2
3 6
1 2
3 2
2 4
输出
4
说明
从里到外分别是{1,2},{2,3},{3,4},{4,5}。
解法一:借助递增子序列的思想
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int len = Integer.parseInt(br.readLine());
Env[] envs = new Env[len];
for(int i=0;i<len;i++){
String[] info = br.readLine().trim().split(" ");
int l = Integer.parseInt(info[0]);
int w = Integer.parseInt(info[1]);
envs[i] = new Env(l,w);
}
int res = getMax(envs);
System.out.println(res);
}
public static int getMax(Env[] envs){
if(envs==null||envs.length==0){
return 0;
}
if(envs.length==1){
return 1;
}
//排序
Arrays.sort(envs,new MyComparator());
//求最长递增子序列即可
Env[] ends = new Env[envs.length];
ends[0] = envs[0];
int l = 0;
int r = 0;
int right = 0;
for(int i=1;i<envs.length;i++){
while(l<=r){
int mid = (l+r)/2;
if(ends[mid].wid>envs[i].wid){
r = mid-1;
}else{
l = mid+1;
}
}
right = Math.max(l,right);
ends[l] = envs[i];
l = 0;
r = right;
}
return right+1;
}
}
class MyComparator implements Comparator<Env>{
public int compare(Env o1,Env o2){
return o1.len!=o2.len?o1.len-o2.len:o2.wid-o1.wid;
}
}
class Env{
int len;
int wid;
public Env(int len,int wid){
this.len = len;
this.wid = wid;
}
}