Day27.
leetcode 646.最长数对链
给你一个由 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] 。
贪心算法:
挑选最长数对链的第一个数对时,最优的选择是挑选第二个数最小的数对,以此类推。
代码:
class Solution {
public:
int findLongestChain(vector<vector<int>>& pairs) {
sort(pairs.begin(), pairs.end(), [](const vector<int>& a, const vector<int>& b) {
return a[1] < b[1];
});
int count = 1;
int end = pairs[0][1];
for (int i = 1; i < pairs.size(); ++i) {
if (pairs[i][0] > end) {
count++;
end = pairs[i][1];
}
}
return count;
}
};
代码逻辑:
1. 排序:
sort(pairs.begin(), pairs.end(), [](const vector<int>& a, const vector<int>& b) {
return a[1] < b[1];
});
-
按照数对的第二个元素升序排序。
-
示例:
- 排序前:
pairs = [[1, 2], [4, 5], [2, 3]]
- 排序后:
pairs = [[1, 2], [2, 3], [4, 5]]
- 排序前:
2. 初始化:
int count = 1;
int end = pairs[0][1];
count
:记录当前数对链长度,初始值为1。end
:记录当前数对链最后一个数对的第二个值,初始值为第一个数对的结束值。
3. 遍历数对:
for (int i = 1; i < pairs.size(); ++i) {
if (pairs[i][0] > end) {
count++;
end = pairs[i][1];
}
}
- 从第二个数对开始,如果当前数对的开始值
pairs[i][0]
大于end
,说明可以接在后面。 - 将
count
加1,更新end
为当前数对的结束值pairs[i][1]
。
4. 返回结果:
return count;
- 返回数对链的长度。