给定一个N行2列的二维数组arr,每一个小数组的两个值分别代表一个信封的长和宽,如果信封A的长和宽小于信封B,那么信封A可以放在信封B里,返回信封最多可以嵌套多少层。
例:arr = {
{3,4}
{2,3}
{4,5}
{1,3}
{2,3}
{3,6}
{1,2}
{3,2}
{2,4}
}
信封最多可以嵌套4层,从里到外分别是{1,2} {2,3} {3,4} {4,5},所以返回4。
此问题与最长增长子序列问题思想类似。
把N个长度为2的小数组变成信封数组。然后对信封数组排序,排序的策略为:按照长度从小到大排序,长度相等的信封之间按照宽度从大到小排序,代码如下:
//定义信封类以及信封的长和宽信息1
2
3
4
5
6
7
8
9class Envelope {
public int len;
public int wid;
public Envelope (int len,int wid) {
this.len = len;
this.wid = wid;
}
}
//定义类进行信封的比较1
2
3
4
5
6
7
8class EnvelopeComparator implements Comparator<Envelope> {
@Override
public int compare(Envelope o1, Envelope o2) {
// TODO Auto-generated method stub
return o1.len != o2.len ? o1.len - o2.len : o2.wid - o1.wid;
}
}
1 | class MostEnvelope { |