You are given n pairs of numbers. In every pair, the first number is always smaller than the second number.

Now, we define a pair (c, d) can follow another pair (a, b) if and only if b < c. Chain of pairs can be formed in this fashion.

Given a set of pairs, find the length longest chain which can be formed. You needn't use up all the given pairs. You can select pairs in any order.

Example 1:

Input: [[1,2], [2,3], [3,4]]
Output: 2
Explanation: The longest chain is [1,2] -> [3,4]

Note:

  1. The number of given pairs will be in the range [1, 1000].

这道题给了我们一些链对,规定了如果后面链对的首元素大于前链对的末元素,那么这两个链对就可以链起来,问我们最大能链多少个。那么我们想,由于规定了链对的首元素一定小于尾元素,我们需要比较的是某个链表的首元素和另一个链表的尾元素之间的关系,如果整个链对数组是无序的,那么就很麻烦,所以我们需要做的是首先对链对数组进行排序,按链对的尾元素进行排序,小的放前面。这样我们就可以利用Greedy算法进行求解了。我们可以用一个栈,先将第一个链对压入栈,然后对于后面遍历到的每一个链对,我们看其首元素是否大于栈顶链对的尾元素,如果大于的话,就将当前链对压入栈,这样最后我们返回栈中元素的个数即可,参见代码如下:

解法一:

class Solution {
public:
int findLongestChain(vector<vector<int>>& pairs) {
stack<vector<int>> st;
sort(pairs.begin(), pairs.end(), [](vector<int>& a, vector<int>& b) {
return a[] < b[];
});
for (auto pair : pairs) {
if (st.empty()) st.push(pair);
else {
auto t = st.top();
if (pair[] > t[]) st.push(pair);
}
}
return st.size();
}
};

我们可以对上面解法的空间进行优化,并不需要用栈来记录最长链上的每一个链对。而是用一个变量end来记录当前比较到的尾元素的值,初始化为最小值,然后遍历的时候,如果当前链对的首元素大于end,那么结果res自增1,end更新为当前链对的尾元素,参见代码如下:

解法二:

class Solution {
public:
int findLongestChain(vector<vector<int>>& pairs) {
int res = , end = INT_MIN;
sort(pairs.begin(), pairs.end(), [](vector<int>& a, vector<int>& b) {
return a[] < b[];
});
for (auto pair : pairs) {
if (pair[] > end) {
++res;
end = pair[];
}
}
return res;
}
};

这道题论坛上最火的解法是用DP来做的,但是博主认为Greedy能解的就没有必要利用到DP,而且还不省空间,有点杀鸡用牛刀的感觉。不过话说这道题链来链去,为啥会让博主想到啥啥蜈蚣啊,什么鬼。。。

类似题目:

Increasing Subsequences

Longest Increasing Subsequence

Non-overlapping Intervals

参考资料:

https://discuss.leetcode.com/topic/96966/earliest-deadline-first-algorithm-greedy-same-as-maximum-jobs-we-can-accomplish

LeetCode All in One 题目讲解汇总(持续更新中...)

最新文章

  1. Base64原理解析
  2. Oracle
  3. 只要项目是maven构建的,pom.xml中依赖的jar包全都默认去你电脑本地仓库去找
  4. iOS UICollectionView之二(垂直滚动)
  5. js函数:setInterval()/clearInterval()——js网页计时器
  6. Jordan Lecture Note-1: Introduction
  7. jQuery—一些常见方法(1)【filter(),not(),has(),next(),prev(),find(),eq(),index(),attr(),】
  8. cocos2d-x3.0 Physics新的物理引擎
  9. 二叉树(二叉链表实现)JAVA代码
  10. NYNU_省赛选拔题(8)
  11. JAVA连接SAP
  12. 移动端调试神器-vConsole
  13. C#线程同步--限量使用
  14. Inside The C++ Object Model(三)
  15. Hadoop2.2.0分布式安装配置详解[3/3]
  16. python面向对象之 类的关系
  17. Vue图片懒加载
  18. linux 查看机器内存方法 (free命令)
  19. MyBatis学习(一)一个简单的例子
  20. apsx 页面 if(!ispostback)其用法和作用 什么时候该用?

热门文章

  1. [css 实践篇] 解决悬浮的&lt;header&gt; &lt;footer&gt;遮挡内容的处理技巧
  2. 实现Windows程序的数据绑定
  3. 记录一个古老的Sql分页过程
  4. .Net开发之旅(一个年少轻狂的程序员的感慨)
  5. JAVA-基础语法篇
  6. MySQL之索引详解
  7. C语言博客-指针
  8. 20145237 《Java程序设计》第三周学习总结
  9. css3 文字的设置
  10. SQL语句取多列的最小值(排除0)