[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,难度 ...
随机推荐
- Cloth Simulation with Root Finding and Optimization
目录 0 前言 1 Implicit Method 1.1 Root-finding 1.2 Optimization 1.3 Insight 2 Newton-Raphson Method 3 Ma ...
- Invalid default value for prop "value": Props with type Object/Array must use a factory function to return the default value.
Invalid default value for prop "value": Props with type Object/Array must use a factory fu ...
- 霍夫(Hough)直线变换(直线检测)
0 原理 霍夫变换在检测各种形状的的技术中非常流行,如果你要检测的形状可以用数学表达式写出,你就可以是使用霍夫变换检测它.及时要检测的形状存在一点破坏或者扭曲也可以使用.我们下面就看看如何使用霍夫变换 ...
- 轻量级网络-CSPNet 论文解读
摘要 1,介绍 2,相关工作 3,改进方法 3.1,Cross Stage Partial Network 3.2,Exact Fusion Model 4,实验 4.1,实验细节 4.2,消融实验 ...
- 超级干货:Air780E之RS485通信篇,你学会了吗?
今天,我们来学习低功耗4G模组Air780E的RS485通信,同学们,你学习了吗? 一.RS485简介 物联网(IoT)在工业场景中的应用越来越广泛,而RS485是一种常见的通信协议,广泛应用于 ...
- 测试App出现闪退应对方法
1.使用adb logcat 查看日志,使用adb logcat -f sdcard/log.txt(输出到手机上) ,先查看报错信息 2.保证主线程能够继续运行,避免在子线程中与UI交互 3.内存溢 ...
- (Python基础教程之二)在Sublime Editor中配置Python环境
Python基础教程 在SublimeEditor中配置Python环境 Python代码中添加注释 Python中的变量的使用 Python中的数据类型 Python中的关键字 Python字符串操 ...
- Golang之学习资源参考
使用golang开发也有一段时间,在此总结一些自己从0入门到掌握所涉及一些资源,希望可以帮助其他人 [初级] 基础语法练习: https://gobyexample.com/ [中级] 1.gola ...
- 【集成-Nacos】SpringBoot集成Nacos
注意:以下主要演示动态配置 Nacos 是什么? Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生 ...
- 为什么你用的 MyBatis 慢?一行配置让它性能翻倍!
为什么你用的 MyBatis 慢?一行配置让它性能翻倍! 在 Java 后端开发的江湖里,MyBatis 堪称一员大将,凭借着灵活的 SQL 编写.方便的数据库对接能力,深受广大开发者的喜爱.但不少小 ...