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
The longest increasing subsequence is
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();
}
};
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();
}
};
相关文章推荐
- 虚拟现实-VR-UE4-编译源代码后,无法运行
- IOS 之loading效果——UIActivityIndicatorView
- UE4子弹特效
- UE4动画功能整理
- LeetCode 96. Unique Binary Search Trees
- UE4事件相关总结
- UE4异步载入资源
- Phoronix-test-suite benchmark toolkit
- iOS学习 数据库 FMDB框架使用 UISearchBar搜索框 线程安全,事务
- Android奇怪错误---java.lang.NumberFormatException: Color value '@drawable/C-t' must start with ‘#’
- Servlet学习(八)request转发
- UUID实现
- 成长小计-控制器中有UIScrollView控件时,无法响应触摸事件
- 【翻译】Fluent NHibernate介绍和入门指南
- easyui datagrid 表格组件列属性formatter和styler使用方法
- ubuntu系统安装arduino流程
- 在Kubernetes上搭建EFK(Fluentd+Elasticsearch+Kibana)
- TestNG测试报告美化buid.xml配置
- UE4 减少APK包的大小
- UUID详解