首页 > 其他分享 >[LC646]最长数对链

[LC646]最长数对链

时间:2022-09-03 19:33:56浏览次数:88  
标签:pairs LC646 int 数对 y1 最优 最长 贪心

题目概述

给出 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;
    }   
}

标签:pairs,LC646,int,数对,y1,最优,最长,贪心
From: https://www.cnblogs.com/xy1997/p/16653391.html

相关文章

  • letcode算法--9.最长公共前缀
    编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。示例1:输入:strs=["flower","flow","flight"]输出:"fl"示例2:输入:strs=["dog......
  • 687. 最长同值路径
    687.最长同值路径给定一个二叉树的 root ,返回 最长的路径的长度,这个路径中的 每个节点具有相同值 。这条路径可以经过也可以不经过根节点。两个节点之间的路......
  • 查询SQL Server数据库执行时间最长的sql语句
    SELECT(total_elapsed_time/execution_count)/1000N'平均时间ms',total_elapsed_time/1000N'总花费时间ms',total_worker_time/1000N'所用的CPU总时间ms',total_p......
  • 缩点后 spfa求最长路(不知道为什么top+dp做不了)
    #include<queue>#include<cstdio>#include<cstring>#defineN500005usingnamespacestd;structedge{intto,val,next;}e[N];intm,n,p,s,cnt,g[N],u[N],v......
  • 力扣388(java)-文件的最长绝对路径(中等)
    题目:假设有一个同时存储文件和目录的文件系统。下图展示了文件系统的一个示例: 这里将dir作为根目录中的唯一目录。dir包含两个子目录subdir1和subdir2。subdir1......
  • 差分约束:求最小->求所有下界的最大->最长路 √
    最长路如果有正环就输出无解a>b那么b到a连一条长度为1的边结论:一个正环一定是某个scc中的对于某个scc中的所有边,只要又一个边的权重是严格>0因为u+w->bw>0又u和v......
  • 动态规划之——最长递增子序列
    最长递增子序列(LongestIncreasingSubsequence)是指在给定的一组数字中,按照从左向右顺序,由递增的数字组成的子序列(中间可以有间隔)中,取长度最大的子序列即为最长递增子序列......
  • leetcode 409 Longest Palindrome 最长回文串(简单)
    一、题目大意给定一个包含大写字母和小写字母的字符串s,返回通过这些字母构造成的最长的回文串。在构造过程中,请注意区分大小写。比如"Aa"不能当做一个回文字符......
  • 求一个图的最打的半联通子集=求一个图的最长链方案和个数
    拓扑图最长路等于背包问题求方案数因为要求点不同存在多条边同一情况需要边判重(set)拓扑求方案数#include<iostream>#include<cstring>#include<algorithm>......
  • P4551 最长异或路径
    给定树上\(n\)个点和边权,求两点间所有边权的异或和最大。\(n\leq10^5\)。首先如果假定一个根,那么所有点到根的距离\(dis[i]\)中两两异或得到的就是答案。(\(x,y\)......