当前位置: 首页 > news >正文

【leetcode】【2022/9/3】646. 最长数对链

问题描述:

  • 给出 n 个数对,在每一个数对中,第一个数字总是比第二个数字小。
    • 现在定义一种跟随关系,当且仅当 b < c 时,数对 (c, d) 才可以跟在 (a, b) 后面,用这种形式来构造一个数对链。
  • 给定一个数对集合,找出能够形成的最长数对链的长度。【不需要用到所有的数对,可以以任何顺序选择其中的一些数对来构造】

核心思路:

  • 可以把数对看作时间,即该题就是找出尽量多不重叠的时间区间。
  • 一种方法是排序 + 动态规划。
    • 创建一维 dp 数组,其中 dp[i] 代表以数对 pairs[i] 为结尾的最长数对链长度。
    • 该解法其实是暴力求解,排序后遍历数组,在当前数对 pairs[i] 下搜索所有索引小于 i 的数对 pairs[j],判断 paris[i][0] 是否大于 paris[j][1],如果大于,则说明区间不重叠,此时 dp[i] = max(dp[i], dp[j] + 1)
  • 另一种方法是排序 + 贪心。
    • 贪心策略其实就是想明白如何作出局部最优。
    • 在区间问题上,为了找出更多不重叠的区间,最好的策略就是选择最先结束的,最先结束的不会影响后续的区间数。
    • 因此假设数对为 [start, end],就先将 pairs 数组按照 end 来排序。
    • 排序后不断将先结束的并且和前面不重叠的数对加入链中即可。

代码实现:

  • 动态规划解法代码实现如下:
    class Solution
    {
    public:
        int findLongestChain(vector<vector<int>>& pairs)
        {
            int m = pairs.size();
            vector<int> ans(m, 1);
            sort(pairs.begin(), pairs.end());
            for(int i = 1; i < m; ++i)
            for(int j = i-1; j >= 0; --j)
            {
                if(pairs[i][0] > pairs[j][1])
                    ans[i] = max(ans[i], ans[j]+1);
            }
            return ans[m-1];
        }
    };
    
  • 贪心解法代码实现如下:
    class Solution
    {
    public:
        int findLongestChain(vector<vector<int>>& pairs)
        {
            sort(pairs.begin(), pairs.end(), [&](const vector<int>& a, const vector<int>& b)
            {
                return a[1] < b[1];
            });
            int cnt = 1, pre = pairs[0][1];
            for(int i = 1; i < pairs.size(); ++i)
            {
                if(pairs[i][0] > pre)
                {
                    ++cnt;
                    pre = pairs[i][1];
                }
            }
            return cnt;
        }
    };
    

相关文章:

  • Matlab:Matlab编程语言应用之数学计算(向量数组矩阵索引、矩阵索引四则运算、行列式与线性系统求解)的简介、案例实现之详细攻略
  • c++11 多线程支持 (std::async)
  • 修复 JavaScript 错误的四种方法
  • 基本的Python内置函数
  • WANem弱网环境模拟工具的使用探索
  • springboot毕设项目医院预约挂号系统ey211(java+VUE+Mybatis+Maven+Mysql)
  • 深入理解计算机系统,汇编的流程控制
  • 202206-2 CCF 寻宝!大冒险! (简单模拟 满分题解)
  • Linux 下基于cpr 开发 http 应用 : 通过编译安装cpr源码方式进行C++ 开发
  • Android初级工程师进阶教程
  • 【Python零基础入门篇 · 3】:掌握数值类型、进制的转换
  • 基于ssm的电动车实名制挂牌管理系统
  • 解锁新技能《Redis ACL SETUSER命令》
  • 1044 Shopping in Mars(二分)
  • 最大公约数——Hankson的趣味题(线筛法求质数+gcd+质因数组合搜索约数)
  • 【5+】跨webview多页面 触发事件(二)
  • Android 架构优化~MVP 架构改造
  • LeetCode18.四数之和 JavaScript
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • Redux 中间件分析
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • Twitter赢在开放,三年创造奇迹
  • TypeScript迭代器
  • 安卓应用性能调试和优化经验分享
  • 不上全站https的网站你们就等着被恶心死吧
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 近期前端发展计划
  • 如何胜任知名企业的商业数据分析师?
  • 树莓派 - 使用须知
  • 说说动画卡顿的解决方案
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • ​虚拟化系列介绍(十)
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • #NOIP 2014# day.1 T2 联合权值
  • (1)常见O(n^2)排序算法解析
  • (bean配置类的注解开发)学习Spring的第十三天
  • (HAL库版)freeRTOS移植STMF103
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (转载)从 Java 代码到 Java 堆
  • .Net 4.0并行库实用性演练
  • .Net Core缓存组件(MemoryCache)源码解析
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .net 无限分类
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • [ vulhub漏洞复现篇 ] JBOSS AS 4.x以下反序列化远程代码执行漏洞CVE-2017-7504
  • [2021 蓝帽杯] One Pointer PHP
  • [AHOI2009]中国象棋 DP,递推,组合数
  • [AIGC] 使用Curl进行网络请求的常见用法
  • [Android 13]Input系列--获取触摸窗口
  • [Angularjs]ng-select和ng-options
  • [AUTOSAR][诊断管理][ECU][$37] 请求退出传输。终止数据传输的(上传/下载)
  • [C/C++]数据结构 栈和队列()
  • [Django 0-1] Core.Handlers 模块