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].
分析
首先按每个pair的第二个元素从小到大,如果第二个元素相等就按第一个元素从小到大排序,然后dp[i]是第1对pair到第i对pair时最长的子序列pair的递增长度。(O(n^2))
bool cmp(vector<int> v1,vector<int> v2){
return v1[1]!=v2[1]?v1[1]<v2[1]:v1[0]<v2[0];
}
class Solution {
public:
int findLongestChain(vector<vector<int>>& pairs) {
sort(pairs.begin(),pairs.end(),cmp);
int dp[pairs.size()+1]={1};
int longest=1,len=1;
for(int i=1;i<pairs.size();i++)
for(int j=i-1;j>=0;j--)
if(pairs[i][0]>pairs[j][1]){
dp[i]=max(dp[j]+1,dp[i]);
if(longest<dp[i])
longest=dp[i];
}
return longest;
}
};
O(n)的解法
class Solution {
public:
int findLongestChain(vector<vector<int>>& pairs) {
sort(pairs.begin(), pairs.end(), cmp);
int cnt = 0;
vector<int>& pair = pairs[0];
for (int i = 0; i < pairs.size(); i++) {
if (i == 0 || pairs[i][0] > pair[1]) {
pair = pairs[i];
cnt++;
}
}
return cnt;
}
private:
static bool cmp(vector<int>& a, vector<int>&b) {
return a[1] < b[1] || a[1] == b[1] && a[0] < b[0];
}
};