一、题目描述:
二、思路分析:
按照套娃信封的规则,套成套娃的信封不管宽度还是长度都是严格单调递增的
排序后,可能需要考虑宽度相同|长度相同的情况
dp[i]表示以i为结尾的最长子序列长度
所以说这完全是最长子序列题
三、AC 代码:
class Solution {
public:
int maxEnvelopes(vector<vector<int>>& envelopes) {
if (envelopes.empty()) {
return 0;
}
int n = envelopes.size();
sort(envelopes.begin(), envelopes.end(), [](const auto& e1, const auto& e2) {
return e1[0] < e2[0] || (e1[0] == e2[0] && e1[1] > e2[1]);
});
vector<int> f(n, 1);
for (int i = 1; i < n; ++i) {
for (int j = 0; j < i; ++j) {
if (envelopes[j][1] < envelopes[i][1]) {
f[i] = max(f[i], f[j] + 1);
}
}
}
return *max_element(f.begin(), f.end());
}
};
四、总结:
这道题和我之前写的最长上升子序列没有任何区别,差的就是个手动排序
知道答案以后感觉很没意思
偏偏自己也没想出来要先排序
感觉思路被模板限制住了
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情