comments | difficulty | edit_url | tags | ||||
---|---|---|---|---|---|---|---|
true |
中等 |
|
给你一个由 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
我们将所有数对按照第二个数的升序排序,用一个变量
遍历排序后的数对,如果当前数对的第一个数大于
遍历结束后,返回答案即可。
时间复杂度
class Solution:
def findLongestChain(self, pairs: List[List[int]]) -> int:
pairs.sort(key=lambda x: x[1])
ans, pre = 0, -inf
for a, b in pairs:
if pre < a:
ans += 1
pre = b
return ans
class Solution {
public int findLongestChain(int[][] pairs) {
Arrays.sort(pairs, (a, b) -> Integer.compare(a[1], b[1]));
int ans = 0, pre = Integer.MIN_VALUE;
for (var p : pairs) {
if (pre < p[0]) {
++ans;
pre = p[1];
}
}
return ans;
}
}
class Solution {
public:
int findLongestChain(vector<vector<int>>& pairs) {
ranges::sort(pairs, {}, [](const auto& p) { return p[1]; });
int ans = 0, pre = INT_MIN;
for (const auto& p : pairs) {
if (pre < p[0]) {
pre = p[1];
++ans;
}
}
return ans;
}
};
func findLongestChain(pairs [][]int) (ans int) {
sort.Slice(pairs, func(i, j int) bool { return pairs[i][1] < pairs[j][1] })
pre := math.MinInt
for _, p := range pairs {
if pre < p[0] {
ans++
pre = p[1]
}
}
return
}
function findLongestChain(pairs: number[][]): number {
pairs.sort((a, b) => a[1] - b[1]);
let [ans, pre] = [0, -Infinity];
for (const [a, b] of pairs) {
if (pre < a) {
++ans;
pre = b;
}
}
return ans;
}
impl Solution {
pub fn find_longest_chain(mut pairs: Vec<Vec<i32>>) -> i32 {
pairs.sort_by_key(|pair| pair[1]);
let mut ans = 0;
let mut pre = i32::MIN;
for pair in pairs {
let (a, b) = (pair[0], pair[1]);
if pre < a {
ans += 1;
pre = b;
}
}
ans
}
}