您的位置:首页 > 产品设计 > UI/UE

300. Longest Increasing Subsequence(good!)

2016-07-19 16:37 363 查看
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();
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: