问题描述:
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:
The number of given pairs will be in the range [1, 1000].
问题的简单描述为给定一串数组,返回可构成上升序列的最长数组串长度。
解决该问题应分为两步:
1. 对数组排序 (按pair[i][0]从小到大排序或按pair[i][1]由小到大排序)
2. 保存当前得到的数组串的最大值,将下一个数组中的较小值与该最大值比较并更新最大值。(与动态规划的思想类似,保留当前状态,判断是否转换到下一状态)
C++代码
- 对pair[i][0]排序
class Solution {
public:
int findLongestChain(vector<vector<int>>& pairs) {
int len = pairs.size();
sort(pairs.begin(), pairs.end(), [](vector<int> &a, vector<int> &b){return a[1] < b[1];});
int m = pairs[0][1], cnt = 1;
for(int i=1; i<len; i++)
{
if(m < pairs[i][0])
{
m = pairs[i][1];
cnt++;
}
}
return cnt;
}
};
- 对pair[i][1]排序
class Solution {
public:
int findLongestChain(vector<vector<int>>& pairs) {
int n = pairs.size(), count = 0, end = INT_MIN;
sort(pairs.begin(), pairs.end());
for(int i=0; i<n; i++)
{
if(pairs[i][0]>end)
{
end = pairs[i][1];
count++;
}
else if(pairs[i][1] < end)
end = pairs[i][1];
}
return count;
}
};
注意:用sort函数对某一列排序时需重新定义