标签:
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; } };
LintCode "Longest Increasing Subsequence"
标签:
原文地址:http://www.cnblogs.com/tonix/p/4818122.html