题目描述:

给定一个无序的整数数组,找到其中最长上升子序列的长度。

示例:

输入: [10,9,2,5,3,7,101,18]
输出: 4
解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。
说明:

可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。
你算法的时间复杂度应该为 O(n2) 。
进阶: 你能将算法的时间复杂度降低到 O(n log n) 吗?

思路分析:

思路一:根据题目的提示,利用动态规划,可以用O(N^2)的复杂度解这题。直接利用一个dp数组,用从后往前的方式存每个元素当前的最长上升序列,更新的状态转移方程就是dp[i] = max(dp[i], dp[j]+1),这里j的取值是从i+1到dp.size()。

思路二:由于题目的进阶要求是需要将复杂度降到O(NlogN),logn顺利成章会想到用二分查找来降低这个复杂度。实际上这部分的思想是维护一个tail数组,遍历nums数组时,每次都在tail数组中去找大于当前值的树,若有则替换,若没有则将当前值加入tail数组。进行替换的原因是在后续的查找中,可以找到更长的子序列,由于当前的tail中的元素更小了。而实际上,只有在添加新元素时会改变最长子序列的大小,因此这个tail数组的长度始终维持在当前最长子序列的长度。这里在查找数用到了二分查找,代码中直接调用了lower_bound()函数。关于这个函数的说明如下:

第一个first参数是一段连续空间的首地址,last是连续空间末端的地址,val是要查找的值。调用lower_bound()的前提是这段连续的空间里的元素是有序(递增)的。
然后lower_bound()的返回值是第一个大于等于val的值的地址,用这个地址减去first,得到的就是第一个大于等于val的值的下标

同时注意区分另一个upper_bound函数,这个返回值是第一个大于val值的地址。

 

代码:

思路一:

 class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
if(nums.size()==)
return ;
vector<int>dp(nums.size(), );
for(int i=nums.size()-; i>=; i--)
{
for(int j=i+; j<nums.size(); j++)
{
if(nums[j] > nums[i])
{
dp[i] = max(dp[i], dp[j]+);
}
}
}
int max = ;
for(int i=; i<dp.size(); i++)
{
if(dp[i]>max)
max = dp[i];
}
return max;
}
};

思路二:

 class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
if(nums.size()==)
return ;
vector<int> res;
for(int i=; 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();
}
};

最新文章

  1. ADB
  2. Sqli-LABS通关笔录-16
  3. 301 redirect Domain Name using global.asax
  4. 使用git整体流程
  5. 使用secureCRT连接VMware-Ubuntukylin虚拟机
  6. 【转】linux C++ 获取文件信息 stat函数详解
  7. 安装loadrunner11 ,出现如下错误如何解决?
  8. 二进制中连续k个1-题解
  9. Day8 linux软件包管理
  10. [升级说明] Senparc.Weixin.MP v14.8.11 (微信群发接口调整)
  11. gitlab ssh_key
  12. 20165326 java实验二
  13. Hadoop HDFS NameNode工作机制
  14. MT【172】内外圆
  15. 使用VBS控制声音
  16. 高通msm mdm 总结
  17. centos7环境下ELK部署之elasticsearch
  18. 【转】Jmeter笔记:响应断言详解
  19. JavaScript(二):对象、注释、事件!
  20. input propertyChange

热门文章

  1. EntityFramework DBContext 类动态控制 数据库连接(支持Oracle,SQL server)
  2. React的基本知识和优缺点
  3. android启动时间慢的问题
  4. 复盘一篇讲sklearn库的文章(下)
  5. 记录一次Oracle创建DBLink踩到小坑
  6. Linux(CentOS7)下安装Mysql8数据库
  7. Django 之 rest_framework 响应器使用
  8. Mac原型动画设计软件Drama创建3D图层的注意事项,你知道吗?
  9. MySQL对数据表已有表进行分区表
  10. ArcSDE SQL Server 创建地图数据库