LeetCode上俄罗斯套娃信封问题,困难难度,本月第一道困难难度题目,记录下解题思路
传入一个二维数组,每个子数组代表信封的宽高(w,h),要求不能旋转信封的情况下,信封最多能套娃几层
当一个信封的宽高小于另一个的时候,就能放入信封内
例如传入数组为[[5,4],[6,4],[6,7],[2,3],[2,2]]
对应4个信封
在两个维度中间计算怎么都麻烦,这里可以先固定一个维度,例如对宽进行排序,即对应envelopes[i][0]
来排序
这样的话就能忽略掉宽这个维度,只在高维度即
envelopes[i][1]
上进行操作,之后针对这个元素再次排序,在envelopes[i][0]
相等的情况下对envelopes[i][1]
进行排序当忽略掉
envelopes[i][0]
就可以转换为求[2,3,2,4,7]
这个数组中的最长递增子序列,可以看下这篇文章了解下最长递增子序列
var maxEnvelopes = function (envelopes) {
// 保存长度
let len = envelopes.length;
if (len === 0) return 0
// 生成的dp数组
const dp = new Array(len).fill(1);
// 这里用于排序
// 当a[0] - b[0] !== 0的时候就是从小到大排序
// 当a[0] === b[0]的时候,就按b[1] - a[1]进行排序
envelopes.sort((a, b) => a[0] - b[0] || (a[0] == b[0] && b[1] - a[1]));
let max = 1;
// 最长递增子序列
for (let i = 1; i < len; i++) {
for (let j = 0; j < i; j++) {
if (envelopes[i][1] > envelopes[j][1]) {
dp[i] = Math.max(dp[i], dp[j] + 1);
}
}
max = Math.max(max, dp[i]);
}
return max;
};