LeetCode 300. 最长上升子序列(Longest Increasing Subsequence)
题目描述
给出一个无序的整形数组,找到最长上升子序列的长度。
例如,
给出 [10, 9, 2, 5, 3, 7, 101, 18],
最长的上升子序列是 [2, 3, 7, 101],因此它的长度是4。因为可能会有超过一种的最长上升子序列的组合,因此你只需要输出对应的长度即可。
解题思路
用动态规划思想,考虑用一个数组dp记录到当前数字为止,可能的最长上升子序列长度,注意并不一定是当前子序列的解。这样最后返回dp数组的长度即可。具体以上述数组为例:
- 首先把10加入到dp中,此时最长上升子序列长度为1
- 下一个数字是9,它比dp中仅有的数字10要小,可知以9为子序列首数字的可能长度要比10长,因此用9替换10
- 同样把2替换dp中仅有的数字9
- 加入5时,因为5比2大,所以可以组成最长上升子序列,因此把5加入到2之后
- 当前数字3比dp中第二个数字5要小,考虑到之后可能出现的上升序列可能小于5,因此用3替换5
- 加入7时,因为7比dp中最后一个数字3大,所以可以组成最长上升子序列,因此把7加入到3之后
- 同样加入101到dp
- 加入18时,按上述规则用18替换101,最后dp数组为[2,3,7,18],因此最长上升子序列长度为4
通过以上顺序,可以总结出dp数组变化规则:
- 若当前数字大于dp中最后一个数字,则直接插入到最后
- 找到dp数组中第一个大于当前数字的数,并替换为当前数字
- 遍历完数组后,dp数组的大小即为最长上升子序列的长度
其中查找dp数组中第一个大于当前数字的数时,可用二分查找降低时间复杂度,这样此解法的总时间复杂度为Ο(nlogn)
代码
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
int l=nums.size();
vector<int> dp;
if(l==)
return ;
dp.push_back(nums[]);
for(int i=;i<l;i++){
biReplace(dp,nums[i]);
}
return dp.size();
}
void biReplace(vector<int>& dp, int x){
int f=,l=dp.size()-;
if(x>dp[l]){
dp.push_back(x);
return;
}
int m=(f+l)/;
while(dp[m]!=x){
if(dp[m]>x)
l=m-;
else f=m+;
if(f>l){
m=f;
break;
}
m=(f+l)/;
}
dp[m]=x;
}
};
LeetCode 300. 最长上升子序列(Longest Increasing Subsequence)的更多相关文章
- 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 ...
- nlog(n)解动态规划--最长上升子序列(Longest increasing subsequence)
最长上升子序列LIS问题属于动态规划的初级问题,用纯动态规划的方法来求解的时间复杂度是O(n^2).但是如果加上二叉搜索的方法,那么时间复杂度可以降到nlog(n). 具体分析参考:http://b ...
- 动态规划--最长上升子序列(Longest increasing subsequence)
前面写了最长公共子序列的问题.然后再加上自身对动态规划的理解,真到简单的DP问题很快就解决了.其实只要理解了动态规划的本质,那么再有针对性的去做这方的题目,思路很快就会有了.不错不错~加油 题目描述: ...
- 最长递增子序列(Longest increasing subsequence)
问题定义: 给定一个长度为N的数组A,找出一个最长的单调递增子序列(不要求连续). 这道题共3种解法. 1. 动态规划 动态规划的核心是状态的定义和状态转移方程.定义lis(i),表示前i个数中以A[ ...
- 【转】动态规划:最长递增子序列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 ...
- Java实现 LeetCode 300 最长上升子序列
300. 最长上升子序列 给定一个无序的整数数组,找到其中最长上升子序列的长度. 示例: 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,10 ...
- leetcode 300最长上升子序列
用递归DFS遍历所有组合肯定积分会超时,原因是有很多重复的操作,可以想象每次回溯后肯定会有重复操作.所以改用动态规划.建立一个vector<int>memo,初始化为1,memo[i]表示 ...
随机推荐
- opencv中的高维矩阵Mat
本示例程序主要是通过实例演示高维Mat的寻址方式. //3,4分别表示行数.列数,所以3*4是一个页面的元素数,2表示有2个3*4 ,b=,c=; int size[]={a,b,c}; float* ...
- 分布式的几件小事(五)dubbo的spi思想是什么
1.什么是SPI机制 SPI 全称为 Service Provider Interface,是一种服务发现机制. SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实 ...
- js 获取当前月份 第一天和最后一天
js 获取当前月份 第一天和最后一天 var now = new Date(); //当前日期 var nowMonth = now.getMonth(); //当前月 var nowYear = n ...
- UITableViewCell背景色.选中背景色,分割线,字体颜色设置
1.系统默认的颜色设置 //无色 cell.selectionStyle = UITableViewCellSelectionStyleNone; //蓝色 cell.selectionStyle = ...
- emwin之BUTTON控件显示位图和流位图出现卡顿延迟的情况
@2019-05-16 [问题] 参照Armfly的emwin教程第46章 BUTTON-按钮控件显示位图和流位图,实际使用时导致界面切换卡顿延迟较大的情况 [环境] F429IGT6 + W9825 ...
- 好用的数据库压缩软件wingzip
有时候我们导出.sql格式的数据库备份文件过大,超过了某些虚拟空间数据库支持的文件大小限制,我们没办法修改phpMyAdmin 导入MySQL数据库文件大小限制 只能通过压缩数据库来达到上传数据库的目 ...
- MySQL更新字段来自另一个表的count()值
假设有文章post和评论comment两个表,文章表记录有评论的数量,但是这个值我们要一次更新. 如下,现在post表的comment_count都是0,我们的目标是:执行一个SQL语句,让其把统计c ...
- python 继承:重写、拓展(六)
1.继承:父类有的子类也有 2.多继承:若继承多个父类有相同的函数,则继承前面的函数,传递参数的个数也与继承的函数位置有关 3.超继承:针对继承一个父类使用,不仅有父类的特写同时也有自己的新特性 s ...
- centos7中使用yum安装tomcat mysql 等
安装Tomcat 进入 # cd /usr/local/tomcat # wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-7 ...
- window下,nodejs安装http-server,并开启HTTP服务器
1.下载nodejs 官方下载地址:https://nodejs.org/en/ 2.在cmd命令中,输入node -v 输入出版本号,代表安装成功. 3.输入 npm install http-s ...