iven an unsorted array of integers, find the length of longest increasing subsequence.
For example,
Given [10, 9, 2, 5, 3, 7, 101, 18]
,
The longest increasing subsequence is [2, 3, 7, 101]
, therefore the length is 4
. Note that there may be more than one LIS combination, it is only necessary for you to return the length.
Your algorithm should run in O(n2) complexity.
Follow up: Could you improve it to O(n log n) time complexity?
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
if(nums.size()==0) return 0;
vector<int> dp(nums.size(),1);
int res = 1;
for(int i=1; i<nums.size(); ++i){
for(int j=0; j<i; ++j)
{
if(nums[j]<nums[i])
dp[i] = max(dp[i],1+dp[j]);
}
res = max(res, dp[i]);
}
return res;
}
};
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
vector<int> dp;
for (int i = 0; i < nums.size(); ++i){
int lo = 0, hi = dp.size();
while (lo < hi){
int mi = (lo + hi)/2;
if (dp[mi] < nums[i]) lo = mi + 1;
else hi = mi;
}
if (hi == dp.size())
dp.push_back(nums[i]);
else dp[hi] = nums[i];
}
return dp.size();
}
};
两种算法:1:O(n*n) 2:O(nlogn)