题目链接:https://leetcode.com/problems/russian-doll-envelopes/   俄罗斯套娃o(╯□╰)o

方法一 递归

思想:先对套娃从大到小进行排序,然后依次找能够塞进大套娃的小套娃。由于套娃数量很多,大小不一,显而易见有个问题:遇到两个大小相似且不套住彼此的套娃,到底要选择哪一个!选择哪一个才能让总体的套娃数量最多呢?answer is here:递归!讲所有的可能性搞出来。

知识点:(1)sort:左大于右就是从大到小排序(2)vector:begin() end() size() (3)pair:first,secode (4)递归:从起点开始for循环,找到符合要求的小套娃则进入下一层递归。 比如测试用例为[9,8] [7,6] [7,5] [5,5],从[9,8]开始for循环,首先找到[7,6],对[7,6]进行递归,然后找到[7,5],对[7,5]进行递归,然后。。。。

[9,8]->[7,6]->[5,5]

[9,8]->[7,5]

[9,8]->[5,5]

代码:

class Solution {
public:
    static bool compare(pair<int, int>left, pair<int, int>right) {
        if (left.first > right.first) {
            return true;
        } else if (left.first == right.first && left.second > right.second) {
            return true;
        }
        return false;
    }
    
    int maxEnvelopes(vector<pair<int, int>>& envelopes) {
        sort(envelopes.begin(), envelopes.end(), compare);
        int max_num = 0;
        find_next_envelope(envelopes, 0, 1, max_num);
        return max_num;
    }
    
    void find_next_envelope(vector<pair<int, int>> sorted_envelopes, int curr, int envelope_num, int& max_num) {
        if (envelope_num > max_num) {
            max_num = envelope_num;
        }
        for (int i = curr + 1; i < sorted_envelopes.size(); i++) {
            if (sorted_envelopes[i].first < sorted_envelopes[curr].first
                    && sorted_envelopes[i].second < sorted_envelopes[curr].second) {
                find_next_envelope(sorted_envelopes, i, envelope_num + 1, max_num);
            }
        }
    }
};

方法二 动态规划

方法一在leetcode上超时了,时间复杂度太高了,似乎是O(2^n)?于是搞粗来了这种方法!

思想:这种方法主要是解决上面的重复工作问题。假设i为起点,先找到从i到end的max_num。蓝后如果i -1 为起点,那么狠容易找到i-1到end的max_num了。so,有一个result的vector,存储从每个点到end的max_num。从倒数第二个点开始依次向前for循环,找到该点到end的max_num。

1 2 3    4       5         6

i max4 max5 max6

假设i = 3,第二层for循环要从4开始,到end结束。 max3 = 3 + maxj(if 3 可以套在j 外面)

知识点:vector<int> result(envelopes.size(), 1); 原谅我以前不会用vector

代码:

class Solution {
public:
    static bool compare(pair<int, int>left, pair<int, int>right) {
        if (left.first > right.first) {
            return true;
        } else if (left.first == right.first && left.second > right.second) {
            return true;
        }
        return false;
    }
    
    int maxEnvelopes(vector<pair<int, int>>& envelopes) {
        if (envelopes.size() == 0) {
            return 0;
        }
        sort(envelopes.begin(), envelopes.end(), compare);
        int max_num = 1;
        vector<int> result(envelopes.size(), 1);
        for (int i = envelopes.size() - 2; i >= 0; i--) {
            for (int j = i + 1; j < envelopes.size(); j++) {
                if (envelopes[i].first > envelopes[j].first && envelopes[i].second > envelopes[j].second) {
                    result[i] = max(result[j] + 1, result[i]);
                }
            }
            max_num = max(max_num, result[i]);
        }
        
        return max_num;
    }
};

leetcode 354. Russian Doll Envelopes相关推荐

  1. Leetcode之Russian Doll Envelopes

    题目: You have a number of envelopes with widths and heights given as a pair of integers (w, h). One e ...

  2. 354. Russian Doll Envelopes刷题笔记

    题解链接,用dp做 class Solution:def maxEnvelopes(self, envelopes: List[List[int]]) -> int:envelopes.sort ...

  3. leetcode(354)—— Russian Doll Envelopes(俄罗斯套娃信封)

    原题位置:Russian Doll Envelopes | LeetCode OJ 俄罗斯套娃信封问题的本质是一个二维版的 LIS(最长递增子列)的问题.为了更好地理解俄罗斯套娃信封问题的动态规划思路 ...

  4. leetcode算法题--Russian Doll Envelopes

    原题链接:https://leetcode.com/problems/russian-doll-envelopes/ class Solution {public:struct node {int x ...

  5. LeetCode--354. Russian Doll Envelopes

    问题链接:https://leetcode.com/problems/russian-doll-envelopes/ 俄罗斯套娃问题,因垂丝汀!!!,要求俄罗斯套娃能够达到的最多嵌套的层数.先要理解对 ...

  6. LeetCode - 354 俄罗斯套娃信封问题

    题目来源 354. 俄罗斯套娃信封问题 - 力扣(LeetCode) 题目描述 给你一个二维整数数组 envelopes ,其中 envelopes[i] = [wi, hi] ,表示第 i 个信封的 ...

  7. LeetCode 354. 俄罗斯套娃信封问题(最长上升子序 DP/二分查找)

    1. 题目 给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现. 当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样. 请计算最多 ...

  8. leetcode 354. 俄罗斯套娃信封问题(二维排序有关)

    题目描述 给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现.当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样. 请计算最多能有 ...

  9. Leetcode 354题:俄罗斯套娃信封问题

    1.题目描述 给你一个二维整数数组 envelopes ,其中 envelopes[i] = [wi, hi] ,表示第 i 个信封的宽度和高度. 当另一个信封的宽度和高度都比这个信封大的时候,这个信 ...

最新文章

  1. unity 游戏第一次安装完之后运行,切出来,点击桌面图标后黑屏问题
  2. 样式处理——提取样式文件
  3. java 禁止使用多线程_Java多线程(四)-线程状态的转换 - Java 技术驿站-Java 技术驿站...
  4. 操作系统下查看HBA卡信息wwn的方法
  5. welcome to my blog
  6. 多线程和单线程 打印数字到100000 的速度对比
  7. 黄仕沛经方医案医话精选(上) 王晓军 整理
  8. excel教程自学网_我要自学网视频教程
  9. VSCode详细安装教程
  10. java comparable接口_浅谈程序接口
  11. 实现机器学习的循序渐进指南IV——逻辑回归
  12. AE+C#实现:在SceneControl里打开和保存
  13. 颠覆QQ,干掉微信?腾讯内测“朋友”,会是下一个国民社交APP吗
  14. MATLAB数字图像处理详细总结
  15. 高薪的软件测试工程师要掌握哪些专业技能?
  16. android课程设计健身,健身软件课程设计_毕业论文设计.doc
  17. 谁在“盘”物联网的“网”?
  18. ArcGIS栅格数据四参数七参数投影变换
  19. 一文读懂串口及各种电平信号含义
  20. 【总结】初创公司用AWS搭建高扩展性架构

热门文章

  1. html标签怎么快速记忆,seo新手该怎么快速学习html基础代码
  2. MySQL的四种事务隔离级别
  3. 新坑--阿里云图库引入
  4. 字节跳动面试:从草根到百万年薪程序员的十年风雨之路,成功收获美团,小米安卓offer
  5. 2022全球与中国电子纸显示器(EPD)市场现状及未来发展趋势
  6. 【FPGA实例】基于FPGA的DDS信号发生器设计
  7. 智慧网点解决方案 | 助推银行“营销-销售-服务”一体化建设
  8. doraemon的python jquery
  9. Outlook2010客户端—搜索/检索不到近期的邮件
  10. Fiddler-抓取手机app数据包