思路:
方法一:动态规划
i)先将长度升序排列,遇到长度相同的,则降序排列,这样的目的是舍弃一个,只取一个,则把长度小的舍弃
ii)设置dp,经典双重循环,最后取dp中最大的,而不是最后一个
方法二:贪心算法
i)同样要先排序
ii)若当前target比排好序的最后一个值大,则直接插入队尾
否则,使用二分查找,找到已排好序的队列中的大小刚好的位置,插入
代码1(动态规划):
class Solution {
public int maxEnvelopes(int[][] envelopes) {
Arrays.sort(envelopes,new Comparator<int[]>(){
public int compare(int[] a,int[] b){
if(a[0]!=b[0]){
return a[0]-b[0];
}else{
//如果长相同,则将高降序排列,因为同长的2个信封不能放入
//相当于把一个信封舍弃,只取一个信封,则取高更大的那个
return b[1]-a[1];
}
}
});
int n=envelopes.length;
int[] dp=new int[n];
int