[LC646]最长数对链
题目概述
给出 n 个数对。 在每一个数对中,第一个数字总是比第二个数字小。
现在,我们定义一种跟随关系,当且仅当 b < c 时,数对(c, d) 才可以跟在 (a, b) 后面。我们用这种形式来构造一个数对链。
给定一个数对集合,找出能够形成的最长数对链的长度。你不需要用到所有的数对,你可以以任何顺序选择其中的一些数对来构造。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/maximum-length-of-pair-chain
解题思路
这道题可以采用贪心的做法。对于一个已经确定的最优子链条,如何选择一个最优的新数对接上去?答案:我们根据数对的第二个数,对数对数组进行升序排序,得到有序的数组arr。我们记当前已经确定的数对链条的最后一个数对的值为[a,b],那么我们需要在arr中找到一个数对[x,y],在满足x > b的情况下,y是最小的(这里利用有序性,直接遍历,检查是否x > b,第一个满足条件的数对,就是y最小数对)。然后按这个思路,不断的寻找新的最优的新数对即可。
关于贪心方法正确性的证明,假设对于当前最优子链条,能找到更优的新数对[x1,y1],那么y1 必然大于按贪心方法找到的 y(我们在之前的定义中,定义y为找到的第一个符合条件的数对)。如果y1 > y, x1 > b 同时成立,那么数对[x, y]必然可以替换[x1, y1],插入到最优链中。这实际上是矛盾的。因此,按贪心方法即能找到最优的数链。
代码
Java
class Solution {
public int findLongestChain(int[][] pairs) {
Arrays.sort(pairs, (o1, o2)-> o1[1] - o2[1]);
int cnt = 1;
int[] prevElement = pairs[0];
for(int i = 0; i < pairs.length; i++){
if(pairs[i][0] > prevElement[1]){
cnt ++;
prevElement = pairs[i];
}
}
return cnt;
}
}
[LC646]最长数对链的更多相关文章
- [Swift]LeetCode646. 最长数对链 | Maximum Length of Pair Chain
You are given n pairs of numbers. In every pair, the first number is always smaller than the second ...
- Leetcode 645.最长数对链
最长数对链 给出 n 个数对. 在每一个数对中,第一个数字总是比第二个数字小. 现在,我们定义一种跟随关系,当且仅当 b < c 时,数对(c, d) 才可以跟在 (a, b) 后面.我们用这种 ...
- Java实现 LeetCode 646 最长数对链(暴力)
646. 最长数对链 给出 n 个数对. 在每一个数对中,第一个数字总是比第二个数字小. 现在,我们定义一种跟随关系,当且仅当 b < c 时,数对(c, d) 才可以跟在 (a, b) 后面. ...
- LeetCode 646 最长数对链详解
题目描述 给出 n 个数对. 在每一个数对中,第一个数字总是比第二个数字小. 现在,我们定义一种跟随关系,当且仅当 b < c 时,数对(c, d) 才可以跟在 (a, b) 后面.我们用这种形 ...
- java课程课后作业190606之计算最长英语单词链
一个文本文件中有N 个不同的英语单词, 我们能否写一个程序,快速找出最长的能首尾相连的英语单词链,每个单词最多只能用一次.最长的定义是:最多单词数量,和单词中字母的数量无关. 统一输入文件名称:inp ...
- HDU 1423 Greatest Common Increasing Subsequence(LICS入门,只要求出最长数)
Greatest Common Increasing Subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536 ...
- 树上最长不下降链 线段树合并+set
读错题了,然后写了一个树上 LIS,应该是对的吧...... code: #include <bits/stdc++.h> #define N 200005 #define LL long ...
- Swift LeetCode 目录 | Catalog
请点击页面左上角 -> Fork me on Github 或直接访问本项目Github地址:LeetCode Solution by Swift 说明:题目中含有$符号则为付费题目. 如 ...
- C#LeetCode刷题-动态规划
动态规划篇 # 题名 刷题 通过率 难度 5 最长回文子串 22.4% 中等 10 正则表达式匹配 18.8% 困难 32 最长有效括号 23.3% 困难 44 通配符匹配 17.7% ...
- LeetCode刷题总结-动态规划篇
本文总结LeetCode上有动态规划的算法题,推荐刷题总数为54道.具体考点分析如下图: 1.中心扩展法 题号:132. 分割回文串 II,难度困难 2.背包问题 题号:140. 单词拆分 II,难度 ...
随机推荐
- Ubuntu 22.04 全局快捷键失效问题
安装完 Ubuntu 22.04 后,你有可能会发现系统的快捷键失效了.侧栏用 Win + x 选中程序不可用了.为各种应用程序设置的快捷键也不起作用了. 出现此现象的原因,是因为 Ubuntu 22 ...
- GaussDB: db2->gaussdb 函数转换
一.db2->gaussdb函数转换 问题描述:使用GaussDB替代DB2的方案,使用起来还是有些差别,做一下函数的映射转换. DB2写法 GaussDB改写语法 日期函数 days(OU ...
- .NET 隐藏/自定义windows系统光标
本文介绍如何操作windows系统光标.正常我们设置/隐藏光标,只能改变当前窗体或者控件范围,无法全局操作windows光标.接到一个需求,想隐藏windows全局的鼠标光标显示,下面讲下如何操作 先 ...
- 鱼香ROS一键安装软件
一行代码-解决人生烦恼 推荐语:一行代码搭建机器人开发环境(ROS/ROS2/ROSDEP) 开源地址:https://github.com/fishros/install 一键安装指令 wget h ...
- mysql 备份还原命令备忘
1.备份 mysqldump -u username -p databasename tableName > backupfile.sql 2.还原 mysql -u username -p p ...
- WebDriver常用属性和方法
除了上一篇的元素定位方法,Selenium中的WebDriver类中还有一些常用的属性和方法 一.常用的属性 1.下表列出了WebDriver的常用属性 # 属性 属性描述 用途 1 driver.n ...
- 常见return错误
常见return错误 3221225477 (0xC0000005): 访问越界,一般是读或写了野指针指向的内存. 3221225725 (0xC00000FD): 堆栈溢出,一般是无穷递归造成的. ...
- 2.8 忘记root账户密码怎么办?
Linux 的单用户模式有些类似 Windows 的安全模式,只启动最少的程序用于系统修复.在单用户模式(运行级别为 1)中,Linux 引导进入根 shell,网络被禁用,只有少数进程运行. 单用户 ...
- 一文讲透 FPGA CDC 多bit跨时钟域同步-hand-shanking机制
一.背景 数据的跨时钟域处理是FPGA开发过程中的常见问题,存在两种情况 慢时钟向快时钟同步:只需在快时钟域打两拍即可.其RTL如下: 打拍同步的原理:大家在初学FPGA时,经常听过FPGA中对信号打 ...
- Rust 的静态网站生成器「GitHub 热点速览」
如果你做过个人博客网站,那么一定对静态网站生成器不陌生.无论是 Ruby 语言的 Jekyll.Go 语言的 Hugo.还是基于 React 的 Gatsby,这些工具都有庞大的用户群体.对于喜欢的人 ...