Given 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?
方法一:
O(n^2)很容易
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
if (nums.size() == 0) return 0;
vector<int> lis(nums.size(), 1);
int gmax = 1;
for (int i = 1; i < nums.size(); i++){
for (int j = 0; j < i; j++){
if (nums[i]>nums[j]){
lis[i] = max(lis[i], lis[j] + 1);
}
}
if (lis[i]>gmax){
gmax = lis[i];
}
}
return gmax;
}
};
方法二:
O(nlgn)
举个例子,输入为[1,4,6,2,3,5]:
-读到1,将其追加到解集中;
-读到4,将其追加到解集中,解集变为[1,4];
-读到6,将其追加到解集中,解集变为[1,4,6];
-读到2,用其替换解集中的4,解集变为[1,2,6];
-读到3,用其替换解集中的6,解集变为[1,2,3];
-读到5,将其追加到解集中,解集变为[1,2,3,5],得到答案为解集长度4。
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
vector<int> res;
for (int i = 0; i < nums.size(); i++){
auto iter = lower_bound(res.begin(), res.end(), nums[i]);
if (iter == res.end()) res.push_back(nums[i]);
else
*iter = nums[i];
}
return res.size();
}
};