class Solution {
public int maxEnvelopes(int[][] envelopes) {
if (envelopes.length == 0) {
return 0;
}
int n = envelopes.length;
Arrays.sort(envelopes, new Comparator<int[]>() {
public int compare(int[] e1, int[] e2) {
//如果信封一维不等,按一维从低到高排序
if (e1[0] != e2[0]) {
return e1[0] - e2[0];
} else {
//信封一维相等,按二维从高到低排序
return e2[1] - e1[1];
}
}
});
/**
按照长度升序, 同长则宽度降序排列
的最长递增子序列解法来做即可. 排序后等于把在二维(长、宽)
上的最长递增子序列问题转换成一维(宽)上的最长递增子序列的查找, 因为对于
长度来说已经满足递增, 只需要在宽度上也递增即为递增序列, 同长时按宽度降
序排列的原因是避免同长时宽度小的也被列入递增序列中, 例如[3,3], [3,4]
如果宽度也按升序来排列, [3,3]和[3,4]会形成递增序列, 而实际上不行.
**/
int[] f = new int[n];
Arrays.fill(f, 1);
int ans = 1;
for (int i = 1; i < n; ++i) {
for (int j = 0; j < i; ++j) {
if (envelopes[j][1] < envelopes[i][1]) {
f[i] = Math.max(f[i], f[j] + 1);
}
}
ans = Math.max(ans, f[i]);
}
return ans;
}
}


相关推荐
03-04
20

01-25
52
