热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

LongestIncreasingSubsequence最长上升子序列

给定一个无序的整数数组,找到其中最长上升子序列的长度。示例:输入:[10,9,2,5,3,7,101,18]输出:4解释:最长的上升子序列是[2,3,7,10

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

示例:

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

说明:


  • 可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。
  • 你算法的时间复杂度应该为 O(n2) 。

进阶: 你能将算法的时间复杂度降低到 O(n log n) 吗?

思路:

这道题参考了博文的思路

https://www.cnblogs.com/grandyang/p/4938187.html

时间复杂度O(nlogn),自己没想出来,而且感觉太复杂。具体思路如下:

维护一个递增数组dp,如果当前元素比dp的第一个元素小,就把第一个元素替换掉(覆盖第一个元素),如果比最后一个元素大,就插入到dp的最后(不覆盖最后一个元素),如果大小位于第一个元素和最后一个元素中,就通过二分法找到第一个大于该元素的位置,替换掉原始元素(覆盖)。

代码如下:

int lengthOfLIS(vector& nums) {vector dp;if (nums.size() <&#61; 0) {return 0;}dp.push_back(nums[0]);for (int i &#61; 1; i dp[dp.size() - 1]) {dp.push_back(nums[i]);continue;}int left &#61; 0;int right &#61; dp.size()-1;while (left

思路2&#xff1a;采用dp来做&#xff0c;通过维护一个一维数组dp来做&#xff0c;dp[i]表示到第i个元素的最长子序列的个数&#xff0c;那么dp[i&#43;1]的值等于遍历[0,j]的元素&#xff08;0<&#61;j<&#61;i&#xff09;&#xff0c;如果对应的nums[j]

dp[i] &#61; max(dp[j] &#43; 1, dp[i]);

如果遍历完j都没有元素满足nums[j]

参考代码&#xff1a;

int lengthOfLIS(vector& nums) {if(nums.size()&#61;&#61;0){return 0;}int *dp &#61; new int[nums.size()];int res &#61; 1;for (int i &#61; 1; i

思路三&#xff1a;这道题还可以用二分查找&#43;动态规划来做&#xff0c;声明一个一维的数组&#xff08;初始化为空&#xff09;res&#xff0c;其中res表示截止到下标i时&#xff0c;当前存的可能的最长递增子序列&#xff0c;注意这时res中不一定是递增的子序列&#xff0c;但是res的size就是当前最优的递增子序列的长度。

示例如下&#xff1a;

{0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15}

A[0] &#61; 0. Case 1. There are no active lists, create one.
0.
-----------------------------------------------------------------------------
A[1] &#61; 8. Case 2. Clone and extend.
0.
0, 8.
-----------------------------------------------------------------------------
A[2] &#61; 4. Case 3. Clone, extend and discard.
0.
0, 4.
0, 8. Discarded
-----------------------------------------------------------------------------
A[3] &#61; 12. Case 2. Clone and extend.
0.
0, 4.
0, 4, 12.
-----------------------------------------------------------------------------
A[4] &#61; 2. Case 3. Clone, extend and discard.
0.
0, 2.
0, 4. Discarded.
0, 4, 12.
-----------------------------------------------------------------------------
A[5] &#61; 10. Case 3. Clone, extend and discard.
0.
0, 2.
0, 2, 10.
0, 4, 12. Discarded.
-----------------------------------------------------------------------------
A[6] &#61; 6. Case 3. Clone, extend and discard.
0.
0, 2.
0, 2, 6.
0, 2, 10. Discarded.
-----------------------------------------------------------------------------
A[7] &#61; 14. Case 2. Clone and extend.
0.
0, 2.
0, 2, 6.
0, 2, 6, 14.
-----------------------------------------------------------------------------
A[8] &#61; 1. Case 3. Clone, extend and discard.
0.
0, 1.
0, 2. Discarded.
0, 2, 6.
0, 2, 6, 14.
-----------------------------------------------------------------------------
A[9] &#61; 9. Case 3. Clone, extend and discard.
0.
0, 1.
0, 2, 6.
0, 2, 6, 9.
0, 2, 6, 14. Discarded.
-----------------------------------------------------------------------------
A[10] &#61; 5. Case 3. Clone, extend and discard.
0.
0, 1.
0, 1, 5.
0, 2, 6. Discarded.
0, 2, 6, 9.
-----------------------------------------------------------------------------
A[11] &#61; 13. Case 2. Clone and extend.
0.
0, 1.
0, 1, 5.
0, 2, 6, 9.
0, 2, 6, 9, 13.
-----------------------------------------------------------------------------
A[12] &#61; 3. Case 3. Clone, extend and discard.
0.
0, 1.
0, 1, 3.
0, 1, 5. Discarded.
0, 2, 6, 9.
0, 2, 6, 9, 13.
-----------------------------------------------------------------------------
A[13] &#61; 11. Case 3. Clone, extend and discard.
0.
0, 1.
0, 1, 3.
0, 2, 6, 9.
0, 2, 6, 9, 11.
0, 2, 6, 9, 13. Discarded.
-----------------------------------------------------------------------------
A[14] &#61; 7. Case 3. Clone, extend and discard.
0.
0, 1.
0, 1, 3.
0, 1, 3, 7.
0, 2, 6, 9. Discarded.
0, 2, 6, 9, 11.
----------------------------------------------------------------------------
A[15] &#61; 15. Case 2. Clone and extend.
0.
0, 1.
0, 1, 3.
0, 1, 3, 7.
0, 2, 6, 9, 11.
0, 2, 6, 9, 11, 15. <-- LIS List
----------------------------------------------------------------------------

如图所示&#xff0c;每次我们都会维护多个队列&#xff0c;这样每个队列就是有序的&#xff0c;但是其实没必要这么复杂&#xff0c;我们只需要维护一个队列res即可。只需要遍历一遍原数组nums&#xff0c;每次取出当前值n&#61;nums[i]&#xff0c;判断在res中第一个大于等于n的下标&#xff0c;覆盖下标对应的元素&#xff0c;如果没找到&#xff0c;证明比所有res的元素都大&#xff0c;那么在res的尾部加上n元素&#xff0c;最后返回res.size()即可。

参考代码&#xff08;时间复杂度nlogn&#xff09;&#xff1a;

 

class Solution {
public:
int lengthOfLIS(vector& nums) {vector res;for (int &n : nums) {auto it &#61; lower_bound(res.begin(), res.end(), n);if (it &#61;&#61; res.end()) res.push_back(n);else *it &#61; n;}return res.size();
}
};

 


推荐阅读
  • 字符串学习时间:1.5W(“W”周,下同)知识点checkliststrlen()函数的返回值是什么类型的?字 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
  • 利用python爬取豆瓣电影Top250的相关信息,包括电影详情链接,图片链接,影片中文名,影片外国名,评分,评价数,概况,导演,主演,年份,地区,类别这12项内容,然后将爬取的信息写入Exce ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • javascript分页类支持页码格式
    前端时间因为项目需要,要对一个产品下所有的附属图片进行分页显示,没考虑ajax一张张请求,所以干脆一次性全部把图片out,然 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 本文介绍了一种在ANSI C中动态分配二维数组的方法。通过创建指针数组并为每个指针分配连续空间,可以灵活地管理内存。文章还讨论了一些常见的错误和注意事项。 ... [详细]
  • 本文是Java并发编程系列的开篇之作,将详细解析Java 1.5及以上版本中提供的并发工具。文章假设读者已经具备同步和易失性关键字的基本知识,重点介绍信号量机制的内部工作原理及其在实际开发中的应用。 ... [详细]
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
  • 深入解析 Synchronized 锁的升级机制及其在并发编程中的应用
    深入解析 Synchronized 锁的升级机制及其在并发编程中的应用 ... [详细]
  • 2012-06-0821:26:42  用matlab来建模,仿真不同时刻ostask在队列中的装载情况。输入参数如下作为初学者,M文件写的有点长。能实现功能就算学以致用了。cle ... [详细]
  • 在工业过程控制系统中,由于被控对象的环境比较恶劣,干扰源比较多,仪器、仪表采集的信息常会受到干扰,所以在模拟系统中,为了消除干扰,常采用RC滤波电路,而在由工业控制计算机组成的自动 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
author-avatar
鄙人灵魔世界
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有