问题描述
https://leetcode-cn.com/problems/russian-doll-envelopes/
解法(动规问题一般处理)
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 b[1]-a[1];//高度上降序
}else
return a[0]-b[0]; //宽度上升序
}
});//优先按照宽度升序,,然后宽度相同的,按照高度降序——————之所以使用降序,
//因为这个时候,我们保证同宽的只会用到一次(在最长递增子序里面,dp[i]表示以i结尾的最长递增子序,
//所以不可能用到两次,用到两次的情况只会出现在高度升序排序的情况。)
//然后就变成了我们只需要在高度这个维度,去找最长递增子序
int[] height = new int[envelopes.length];//获取其高度列表
for(int i=0;i<envelopes.length;i++){
height[i] = envelopes[i][1];
}
//然后寻找最长递增子序:
return lengthOfLIS(height);
}
//寻找最长递增子序
public int lengthOfLIS(int[] nums) {
if(nums==null) return 0;
int []dp = new int[nums.length];
//边界:
Arrays.fill(dp,1);
//递推:
for(int i=0;i<nums.length;i++){
for(int j=0;j<i;j++){
if(nums[i]>nums[j]){
dp[i] = Math.max(dp[i],dp[j]+1);
}
}
}
//返回结果:
int max = 0;
for(int i=0;i<nums.length;i++){
if(max<dp[i]){
max = dp[i];
}
}
return max;
}
}