LintCode "Longest Increasing Subsequence"

O(nlgn) with repeated numbers.. Please note the extra repeat count array:

class Solution {
public:
    /**
     * @param nums: The integer array
     * @return: The length of LIS (longest increasing subsequence)
     */
    int longestIncreasingSubsequence(vector<int> nums) {
        int n = nums.size();
        if(!n) return 0;
        vector<int> dp(n, 1);
        
        //    c[i]: Smallest LAST elem of a LIS seq with lenghth i
        vector<int> c(1, nums[0]);
        vector<int> l(1, 1); // repeat count
    
        int ret = 0;
        for(int i = 1; i < n; i ++)
        {
            if (nums[i] <= c[0])
            {
                c[0] = nums[i];
                dp[i] = ++l[0];
            }
            else if (nums[i] > c.back())
            {
                c.push_back(nums[i]);
                l.push_back(1);
                dp[i] = c.size();
            }
            else
            {
                int k = std::lower_bound(c.begin(), c.end(), nums[i]) - c.begin();
                if (c[k] == nums[i]) l[k]++;
                
                c[k] = nums[i];
                dp[i] = k + l[k];
            }
            ret = max(ret, dp[i]);
        }
        return ret;
    }
};
原文地址:https://www.cnblogs.com/tonix/p/4818122.html