俄罗斯套娃×最长子序列√|刷题打卡

264 阅读1分钟

一、题目描述:

二、思路分析:

按照套娃信封的规则,套成套娃的信封不管宽度还是长度都是严格单调递增的

排序后,可能需要考虑宽度相同|长度相同的情况

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 春招闯关活动」, 点击查看 活动详情