1、前言

2、思路
先对宽度w进行升序排序,如果遇到w相同的情况,则按照高度h降序排序。之后把所有的h作为一个数组,在这个数组上计算 LIS(最长递增子序列) 的长度就是答案。
w 生序可以理解,为啥要后面按照高度 h 降序呢?如果按照 h 生序,遇到这种:[[1, 1], [2, 2], [2, 3]] 之类的 case 肯定会算出是三个,但是它要求 w、h 都需要按照严格递增的方式才能放进去,所以 h 应该降序排列,即:[[1, 1], [2, 3], [2, 2]],就能避免这种情况。
3、代码
public class NO_354 {
public int maxEnvelopes(int[][] envelopes) {
int n = envelopes.length;
// 宽度升序排序,宽度相同时,则按照高度降序排序
Arrays.sort(envelopes, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[0] == o2[0] ? o2[1] - o1[1] : o1[0] - o2[0];
}
});
// 对高度数组完成 LIS
int[] height = new int[n];
for(int i = 0; i < n; i++){
height[i] = envelopes[i][1];
}
return lengthOfLIS(height);
}
private int lengthOfLIS(int[] nums){
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[j] < nums[i]){
dp[i] = Math.max(dp[i], dp[j] + 1);
}
}
}
int res = 0;
for(int i = 0; i < dp.length; i++){
res = Math.max(res, dp[i]);
}
return res;
}
public static void main(String[] args) {
int[][] en = new int[][]{
{5,4},{6,4}, {6,7}, {2, 3}
};
System.out.println(new NO_354().maxEnvelopes(en));
}
}
网友评论