夯实算法-最长数对链

102 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 13 天,点击查看活动详情

题目:LeetCode

给你一个由 n 个数对组成的数对数组 pairs ,其中 pairs[i] = [lefti, righti] 且 lefti < righti 。

现在,我们定义一种 跟随 关系,当且仅当 b < c 时,数对 p2 = [c, d] 才可以跟在 p1 = [a, b] 后面。我们用这种形式来构造 数对链 。

找出并返回能够形成的 最长数对链的长度 。

你不需要用到所有的数对,你可以以任何顺序选择其中的一些数对来构造。  

示例 1:

输入: pairs[[1,2], [2,3], [3,4]]
输出: 2
解释: 最长的数对链是 [1,2] -> [3,4] 。

示例 2:

输入: pairs = [[1,2],[7,8],[4,5]]
输出: 3
解释: 最长的数对链是 [1,2] -> [4,5] -> [7,8]

提示:

  • n == pairs.length
  • 1 <= n <= 1000
  • -1000 <= lefti < righti <= 1000

解题思路

  • 希望找到尽可能长的数对链,贪心的思想,我们需要当前数对链的结尾值尽可能的小。
  • 比如当前有[1,2],后续可以提供选择的有[3,4],[3,8],那么显然,我们优先选取[3,4],才能让选出的数对尽可能的多。
  • 首先,我们对pairs中的数组,按照第二个元素升序的顺序进行排序,如此,只需按顺序遍历,即可保证不会遗漏,且能得到我们想要的结果。
  • 第一个必选,然后记录当前的尾部值,只要之后的数组起始值大于当前的尾部值,结果+1。同时更新尾部值。

代码实现

public int findLongestChain(int[][] pairs) {
    Arrays.sort(pairs, (o1, o2) - > o1[1] - o2[1]);
    int res = 1;
    int cur = pairs[0][1];
    for (int i = 1; i < pairs.length; i++) {
        if (pairs[i][0] > cur) {
            res++;
            cur = pairs[i][1];
        }
    }
    return res;
}

运行结果

Snipaste_2023-02-16_22-04-06.png

复杂度分析

  • 空间复杂度:O(1)O(1)
  • 时间复杂度:O(n)O(n)

掘金(JUEJIN)  一起分享知识, Keep Learning!