给你一个二维整数数组 envelopes ,其中 envelopes[i] = [wi, hi] ,表示第 i 个信封的宽度和高度。
当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。
请计算 最多能有多少个 信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。
注意:不允许旋转信封。
示例 1:输入:envelopes = [[5,4],[6,4],[6,7],[2,3]]
输出:3
解释:最多信封的个数为 3, 组合为: [2,3] => [5,4] => [6,7]。
示例 2:输入:envelopes = [[1,1],[1,1],[1,1]]
输出:1来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/russian-doll-envelopes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public int maxEnvelopes(int[][] envelopes) {
//记录[w,h]对的数量
int n = envelopes.length;
//用Comparator排序
Arrays.sort(envelopes, new Comparator<int[]>(){
@Override //Override可不写
public int compare(int[] a, int[] b){ //public一定要加上!!!
//按照w升序排列,若w相同,则按照h降序排列
return a[0]==b[0] ? b[1] - a[1] : a[0] - b[0];
}
}
);
int[] h = new int[n];
for(int i = 0; i < n; i++){
h[i] = envelopes[i][1];
}
//用最长子序列求解
return lengthOfLIS(h);
}
//求解最长子序列的长度(又是一道面试题
public int lengthOfLIS(int[] nums){
//dp数组:记录以当前字符结尾的最长子序列长度
int[] dp = new int[nums.length];
//base case: 以每个字符结尾的最长子序列长度至少为1
for(int i = 0; i < dp.length; i++){
dp[i] = 1;
}
//2个for
for(int i = 0; i < nums.length; i++){
for(int j = 0; j < i; j++){
if(nums[j] < nums[i]){
dp[i] = Math.max(dp[j]+1, dp[i]);
}
}
}
//1个for
int res = 1;
for(int i = 0; i < dp.length; i++){
res = Math.max(dp[i], res);
}
return res;
}
}