1. 程式人生 > >LeetCode 646. Maximum Length of Pair Chain

LeetCode 646. Maximum Length of Pair Chain

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];
    }
};