646. 最长数对链(LIS&贪心)
Posted Harris-H
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了646. 最长数对链(LIS&贪心)相关的知识,希望对你有一定的参考价值。
646. 最长数对链(LIS&贪心)
首先pair排序。显然对于 ( a , b ) (a,b) (a,b) 只能选取 c ≤ a c\\le a c≤a的 ( c , d ) (c,d) (c,d)。若 c > a c>a c>a 则不满足 d < a d<a d<a。
然后我们定义小于关系: p i < p j p_i<p_j pi<pj 为 p i p_i pi的第二关键字小于 p j p_j pj的第一关键字。
因此转换为最长递增子序列,直接dp即可。
时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)
class Solution
public:
int findLongestChain(vector<vector<int>>& pairs)
sort(pairs.begin(), pairs.end());
vector<int> arr;
for (auto p : pairs)
int x = p[0], y = p[1];
if (arr.size() == 0 || x > arr.back())
arr.emplace_back(y);
else
int idx = lower_bound(arr.begin(), arr.end(), x) - arr.begin();
arr[idx] = min(arr[idx], y);
return arr.size();
;
贪心的思路:第一个肯定选取 s e c o n d second second最小的,然后再剩下继续选满足条件的 s e c o n d second second最小的。因此按照 s e c o n d second second 排序贪心选即可。
class Solution
public:
int findLongestChain(vector<vector<int>>& pairs)
int curr = INT_MIN, res = 0;
sort(pairs.begin(), pairs.end(), [](const vector<int> &a, const vector<int> &b)
return a[1] < b[1];
);
for (auto &p : pairs)
if (curr < p[0])
curr = p[1];
res++;
return res;
;
以上是关于646. 最长数对链(LIS&贪心)的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 646 最长数对链[贪心 自定义排序] HERODING的LeetCode之路