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)
代码
1 class Solution { 2 public: 3 int lengthOfLIS(vector<int>& nums) { 4 int l=nums.size(); 5 vector<int> dp; 6 if(l==0) 7 return 0; 8 dp.push_back(nums[0]); 9 for(int i=1;i<l;i++){ 10 biReplace(dp,nums[i]); 11 } 12 return dp.size(); 13 } 14 void biReplace(vector<int>& dp, int x){ 15 int f=0,l=dp.size()-1; 16 if(x>dp[l]){ 17 dp.push_back(x); 18 return; 19 } 20 int m=(f+l)/2; 21 while(dp[m]!=x){ 22 if(dp[m]>x) 23 l=m-1; 24 else f=m+1; 25 if(f>l){ 26 m=f; 27 break; 28 } 29 m=(f+l)/2; 30 } 31 dp[m]=x; 32 } 33 };
转载于:https://www.cnblogs.com/wmx24/p/9005718.html
LeetCode 300. 最长上升子序列(Longest Increasing Subsequence)相关推荐
- LeetCode——1143. 最长公共子序列(Longest Common Subsequence)[中等]——分析及代码(Java)
LeetCode--1143. 最长公共子序列[Longest Common Subsequence][中等]--分析及代码[Java] 一.题目 二.分析及代码 1. 动态规划 (1)思路 (2)代 ...
- leetcode数组汇总_[LeetCode] 300. 最长上升子序列
题目链接: https://leetcode-cn.com/problems/longest-increasing-subsequence 难度:中等 通过率:43.0% 题目描述: 给定一个无序的整 ...
- leetcode - 300. 最长上升子序列
给定一个无序的整数数组,找到其中最长上升子序列的长度. 示例: 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4. 说 ...
- Leetcode 300.最长上升子序列(求长度)
Time: 20190906 Type: Medium 题目描述 给定一个无序的整数数组,找到其中最长上升子序列的长度. 示例: 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: ...
- 111. Leetcode 300. 最长递增子序列 (动态规划-子序列问题)
步骤一.确定状态: 确定dp数组及下标含义 dp是长度为len(nums)的数组,dp[i]表示以nums[i]结尾的最长子序列的长度, 这个定义中 nums[i] 必须被选取,且必须是这个子序列的最 ...
- Leetcode 300 最长递增子序列 (每日一题 20210803)
给你一个整数数组 nums ,找到其中最长严格递增子序列的长度.子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序.例如,[3,6,2,7] 是数组 [0,3,1,6,2 ...
- Leetcode——300. 最长上升子序列
题目描述:题目链接 给定一个无序的整数数组,找到其中最长上升子序列的长度. 示例: 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101], ...
- leetcode 300. 最长上升子序列
题目 给定一个无序的整数数组,找到其中最长上升子序列的长度. 示例: 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4 ...
- LeetCode 300. 最长上升子序列(动态规划)
题目描述 给定一个无序的整数数组,找到其中最长上升子序列的长度. 示例: 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 ...
最新文章
- Codeforces Round #650 (Div. 3)(A-F1)题解
- 有5个学生,4门课程,用子函数的方法显示平均分最高的学生的所有成绩
- 帝国cms栏目忘记设置为终极栏目怎么办?
- opencv计算两数组的乘积_opencv矩阵运算(2)
- bcb 如何在DLL中捕捉系统级异常
- 一个countDown在多线程调度下使用不当的分享
- openwrt源码分析_openwrt 15.05.1源码
- 500位全球算法开发者零奖金参加阿里云天池大赛 AI预测台风助力防灾减灾
- Python爬虫知识点四--scrapy框架
- BZOJ 2683: 简单题(CDQ 分治)
- 联想第三季:PC+时代的航母启航?
- 项目管理(PMBOK第六版)常用缩写中英文对照
- 信息安全技术及应用 互联网安全协议
- 省市县联动列表html代码,若依添加省市县联动三级菜单
- 【论文写作技巧】Endnote参考文献统一输出格式
- Base64解码文件下载
- 无法为立即文档创建临时文件: 设备上没有空间(centos root 目录爆满)
- Codeup1032-1033、1045
- 使用 JS 循环解决经典数学问题!
- 代码审计系列:熊海CMS V1.0 (iseaCMS_1.0)
热门文章
- js 语法:JSON.stringify(data, null, 4)
- Linux scp -r命令主机间文件复制
- solr怎么设置搜索结果排名靠前?
- MySQL官方提供的测试数据库脚本和数据文件下载
- 使用pil读取gif图有些位置为黑色_使用 Pillow 快速创建 GIF 动图
- ARM 之五 发展史及各时期内核(ARM1 ~ ARM11 / Cortex)介绍
- ‘a’、“a”、‘abc’和“abc”的区别
- C typedef功能介绍(内附函数指针和指针函数的区别)
- 启明云端分享|乐鑫推出在线选型工具 ESP Product Selector
- 求最大素数的c语言,for语句计算输出10000以内最大素数怎么搞最简单??各位大神们...