最长递增子序列(Longest increasing subsequence)
问题定义:
给定一个长度为N的数组A,找出一个最长的单调递增子序列(不要求连续)。
这道题共3种解法。
1. 动态规划
动态规划的核心是状态的定义和状态转移方程。定义lis(i),表示前i个数中以A[i]结尾的最长递增子序列的长度。可以得到以下的状态转移方程:
d(i) = max(, d(j) + ), 其中j < i,且A[j] <= A[i]
程序实现:
int longestIncreasingSubsequence(vector<int> nums)
{
if (nums.empty())
return ;
int len = nums.size();
vector<int> lis(len, ); for (int i = ; i < len; ++i)
{
for (int j = ; j < i; ++j)
{
if (nums[j] < nums[i] && lis[i] < lis[j] + )
lis[i] = lis[j] + ;
}
}
return *max_element(lis.begin(), lis.end());
}
程序复杂度为O(N^2)
2. 动态规划 + 二分查找
换一种角度看问题。令Ai,j表示所有长度为j的最大递增子序列的最小末尾,我们有Ai,1 < Ai,2 < ... < Ai,j。
对A[i+1]来说,有两种选择。
1. Ai,j < A[i+1], 此时我们可以得到一个长度为i+1的最大递增子序列。
2. 替换Ai,k,如果Ai,k-1 < A[i+1] < Ai,k。
替换长度为k的最大递增子序列的最小末尾,是为了增大获取更长子序列的机会。
程序实现:
int binarySearch(const int arr[], int low, int high, int val)
{
while (low <= high)
{
int mid = low + (high - low) / ; // Do not use (low + high) / 2 which might encounter overflow issue if (val < arr[mid])
high = mid - ;
else if (val > arr[mid])
low = mid + ;
else
return mid;
}
return low;
}
int LIS(int arr[], int n)
{
int *minTail = new int[n];
minTail[] = arr[];
int len = ;
for (int i = ; i < n; ++i)
{
if (arr[i] > minTail[len-])
minTail[len++] = arr[i];
else
{
int pos = binarySearch(minTail, , len-, arr[i]);
minTail[pos] = arr[i];
}
}
delete [] minTail;
return len;
}
复杂度:O(nlogn)
reference :
最长递增子序列(LIS)
3. 排序+LCS
这种方法就不细说了。。。
最长递增子序列(Longest increasing subsequence)的更多相关文章
- 【转】动态规划:最长递增子序列Longest Increasing Subsequence
转自:https://www.cnblogs.com/coffy/p/5878915.html 设f(i)表示L中以ai为末元素的最长递增子序列的长度.则有如下的递推方程: 这个递推方程的意思是,在求 ...
- 算法实践--最长递增子序列(Longest Increasing Subsquence)
什么是最长递增子序列(Longest Increasing Subsquence) 对于一个序列{3, 2, 6, 4, 5, 1},它包含很多递增子序列{3, 6}, {2,6}, {2, 4, 5 ...
- 300最长上升子序列 · Longest Increasing Subsequence
[抄题]: 往上走台阶 最长上升子序列问题是在一个无序的给定序列中找到一个尽可能长的由低到高排列的子序列,这种子序列不一定是连续的或者唯一的. 样例 给出 [5,4,1,2,3],LIS 是 [1,2 ...
- [Swift]LeetCode300. 最长上升子序列 | Longest Increasing Subsequence
Given an unsorted array of integers, find the length of longest increasing subsequence. Example: Inp ...
- 最长递增子序列(Longest Increase Subsequence)
问题 给定一个长度为N的数组,找出一个最长的单调自增子序列(不一定连续,但是顺序不能乱).例如:给定一个长度为6的数组A{5, 6, 7, 1, 2, 8},则其最长的单调递增子序列为{5,6,7,8 ...
- nlog(n)解动态规划--最长上升子序列(Longest increasing subsequence)
最长上升子序列LIS问题属于动态规划的初级问题,用纯动态规划的方法来求解的时间复杂度是O(n^2).但是如果加上二叉搜索的方法,那么时间复杂度可以降到nlog(n). 具体分析参考:http://b ...
- 动态规划--最长上升子序列(Longest increasing subsequence)
前面写了最长公共子序列的问题.然后再加上自身对动态规划的理解,真到简单的DP问题很快就解决了.其实只要理解了动态规划的本质,那么再有针对性的去做这方的题目,思路很快就会有了.不错不错~加油 题目描述: ...
- [Swift]LeetCode329. 矩阵中的最长递增路径 | Longest Increasing Path in a Matrix
Given an integer matrix, find the length of the longest increasing path. From each cell, you can eit ...
- [Swift]LeetCode594. 最长和谐子序列 | Longest Harmonious Subsequence
We define a harmonious array is an array where the difference between its maximum value and its mini ...
随机推荐
- Python爬虫系列(四):Beautiful Soup解析HTML之把HTML转成Python对象
在前几篇文章,我们学会了如何获取html文档内容,就是从url下载网页.今天开始,我们将讨论如何将html转成python对象,用python代码对文档进行分析. (牛小妹在学校折腾了好几天,也没把h ...
- xargs与exec区别
平时使用find命令查找出文件的时候有时候后面有时候用-exec有时候用管道加xargs,这2个到底有什么不同?下面就这2个的不同做简单介绍. 零.实验环境 [root@osker /]# find ...
- tcp长连接、短连接、连接池的思考
在基于tcp的 rcp实现方式中,有如下几种选择: 1. 长连接:同步和异步方式. 同步方式下客户端所有请求共用同一连接,在获得连接后要对连接加锁,在读写结束后才解锁释放连接,性能低下,基本很少采用, ...
- AJ学IOS(31)UI之Quartz2D图形上下文栈
AJ分享,必须精品 首先,前面博客说过.qurza2d的上下文中有绘图信息和绘图的属性. 但是他是怎么绘制到上下午中的呢? 我们画图时候一半会用这三个步骤: (1)获取上下文 (2)绘图 (3)渲染 ...
- AJ学IOS(21)UIApplication设置程序图标右上⾓红⾊数字_联⺴指⽰器等
AJ分享,必须精品 效果简介 UIApplication的运用,有很多相如:进⾏行⼀一些应⽤用级别的操作等等,打开网页,打开电话拨号和信息等.. 什么是UIApplication ● UIApplic ...
- AJ学IOS(13)UI之UITableView学习(下)汽车名牌带右侧索引
AJ分享,必须精品 先看效果图 代码 ViewController #import "NYViewController.h" #import "NYCarGroup.h& ...
- 【乱码问题】IDEA控制台使用了GBK字符集
什么Tomcat乱码设置IDEA的初始编码,瞎搞 终于在这个帖子看到了真相 https://blog.csdn.net/weixin_42617398/article/details/81806438 ...
- 【MyBatis深入剖析】应用分析与最佳实践
##### 文章目标1. 了解ORM框架的发展历史,了解MyBatis特性2. 掌握MyBatis编程式开发方法和核心对象3. 掌握MyBatis核心配置含义4. 掌握MyBatis的高级用法与扩展方 ...
- springboot集成JdbcTemplate+druid
application.yml datasource: username: root password: root url: jdbc:mysql://localhost:3306/early_war ...
- Mac下打开 kvm
mac 下打开 kvm ,需要装这个 https://www.xquartz.org/