博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LCS问题
阅读量:6478 次
发布时间:2019-06-23

本文共 2285 字,大约阅读时间需要 7 分钟。

基本思想:

  最长递增子序列问题原本是动态规划的经典问题,由于这个问题太经典了,所以我把它单独列在基本算法中。最简单的方法是动态规划,用一个数组dp[i]表示以nums[i]结尾的最长递增子序列的长度,对于每个dp[i],遍历dp[k](k<i),在所有nums[k] < nums[i]的元素中找到最大的dp[k]加1就是dp[i],时间复杂度为O(n2)。

1 class Solution { 2 public: 3     int lengthOfLIS(vector
& nums) { 4 if(nums.size() == 0) return 0; 5 vector
dp(nums.size(),1); 6 for(int i = 1;i != nums.size();++i){ 7 for(int j = 0;j != i;++j){ 8 if(nums[i] > nums[j]) 9 dp[i] = max(dp[i],dp[j]+1);10 }11 }12 int result = 0;13 for(int i = 0;i != dp.size();++i)14 result = max(result,dp[i]);15 return result;16 }17 };

  当然如果只是这种解法的话我也不写这篇随笔了,这道题还有一种O(nlogn)的解法,以Leetcode 300的例子为例,给一个数组[10,9,2,5,3,7,101,18],我们维护一个lastelem数组,lastelem[i]=t表示长度为i+1的子序列的第i个元素的最小值为t。有点抽象,那就模拟一下这个例子的解答。

1. [10,9,2,5,3,7,101,18]

         ^

  lastelem = [10]

2. [10,9,2,5,3,7,101,18]

              ^

  lastelem = [9]  //找到地一个比9大的数将其替换为9

3. [10,9,2,5,3,7,101,18]

                  ^

  lastelem = [2]  //同上

4. [10,9,2,5,3,7,101,18]

                      ^

  lastelem = [2,5]  //若5比最后一个数大,新填一个元素

5. [10,9,2,5,3,7,101,18]

                          ^

  lastelem = [2,3]  //同第二步

6. [10,9,2,5,3,7,101,18]

                              ^

  lastelem = [2,3,7]  //同第四步

7. [10,9,2,5,3,7,101,18]

                                    ^

  lastelem = [2,3,7,101]  //同第四步

8. [10,9,2,5,3,7,101,18]

                                           ^

  lastelem = [2,3,7,18]  //同第二步

  所以最终最长子序列的长度为lastelem数组的长度,即4,寻找第一个比nums[i]大的数可以用二分法,所以时间复杂度为O(nlogn). 此题是Leetcode 300原题,因为是基础题型,所以不再写博客解释了。

1 class Solution { 2 public: 3     int lengthOfLIS(vector
& nums) { 4 vector
lastelem; 5 for(int i = 0;i != nums.size();++i){ 6 if(lastelem.empty() || nums[i] > lastelem.back()) 7 lastelem.push_back(nums[i]); 8 else{ 9 int start = 0;10 int end = lastelem.size()-1;11 while(start < end){12 int pivot = start + (end-start)/2;13 if(lastelem[pivot] < nums[i])14 start = pivot+1;15 else16 end = pivot;17 }18 lastelem[start] = nums[i];19 }20 }21 return lastelem.size();22 }23 };

 

转载于:https://www.cnblogs.com/haoweizh/p/10247833.html

你可能感兴趣的文章
SQL存储过程中的几个常见设定SET QUOTED_IDENTIFIER/NOCOUNT/XACT_ABORT ON/OFF
查看>>
第一部分:基础知识(第一章)第一个 Silverlight 手机程序
查看>>
Silverlight与Flash区别之一
查看>>
删除恢复Hadoop集群中的DataNode
查看>>
Silverlight 2动态创建矩形对象(附完整源代码)
查看>>
PowerShell中对属性设置别名
查看>>
从京东技术演进看互联网企业的成长历程
查看>>
MFC ado+mysql+odbc技术分享
查看>>
路由基本命令(含中文解释)
查看>>
js中让字符串中特定字符红色显示
查看>>
HttpClient4.5教程-第二章-连接管理
查看>>
Yeslab 马老师 V2V环境下vCenter Server Heartbeat v6.4实现vCenter5.0的双机备份
查看>>
linux下定时任务
查看>>
redhat Nginx 安装
查看>>
利用START命令入侵
查看>>
oracle 配置监听
查看>>
上海访微软 详解Azure和S+S
查看>>
跨国巨头猛攻语音识别技术 让电脑听懂人们说话
查看>>
使用组策略禁用已安装的设备
查看>>
OSSIM5 自定义安装
查看>>