码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【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];
          }
      };
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
    • 贪心解法代码实现如下:
      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;
          }
      };
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
  • 相关阅读:
    人类历史上第一个人工神经元模型为mp模型有何不提出
    【图像融合】差异的高斯:一种简单有效的通用图像融合方法[用于融合红外和可见光图像、多焦点图像、多模态医学图像和多曝光图像](Matlab代码实现)
    安装robotframework的RIDE/wxPython 依赖VC的编译器, 使用VC BuildTool 解决
    详解容灾架构中的脑裂问题
    25. 答疑 - SAP OData 框架处理 Metadata 元数据请求的实现细节,前后端组件部署在同一台物理服务器
    Android BottomSheetDialogFragment 使用详解,设置圆角、固定高度、默认全屏等
    [C++学习] 多进程通信共享内存
    JS语言里常见的随机函数示例,实验结果分布规律分析
    NLTK安装使用全过程--python
    BSV区块链协会上线首个版本的ARC交易处理器
  • 原文地址:https://blog.csdn.net/weixin_44705592/article/details/126673845
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号