LeetCode 646. Maximum Length of Pair Chain
阿新 • • 發佈:2018-12-06
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]; } };