Leetcode动态规划:300.longest-increasing-subsequence(最长递增子序列)
300. 最长递增子序列
最近一直在攻克动态规划的题,Leetcode的简单题已经刷完,现在冲中等题,这道题算是一个比较经典的题吧,独立完成,虽然花了两个多小时,但收获很多;
思路:动态规划首先要找到状态,其次建立状态转移方程;此处状态无疑就是当前子序列的长度以及子序列的尾数,因为这样才能动态改变状态,比较来了一个大的数字,我可以让子序列长度+1,然后把子序列的尾数更新为它,当然这只是个简单思路,里面还有很多细节问题;
int lengthOfLIS(vector<int> &nums)
{int len = nums.size();if (len < 2)return len;// 先跳过前面的递减序列(如果存在的话)int start = 0;while (start + 1 < len && nums[start] >= nums[start + 1]){start++;}// 核心部分vector<int> vec; // vec[i]=j表示以j结尾的子序列的长度为i,因为这里每次子序列的长度只能增加1,所以用数组下标很合适vec.push_back(0); // vec[0]=0 没意义vec.push_back(nums[start]); // 把第一个元素放进去int cur = 1; //cur表示当前vec数组的长度(不含vec[0] 没意义)// 对于nums的元素nums[i]for (int i = start; i < len; i++){bool flag = true; //flag表示能否在vec中找的比nums[i]小的元素// 在vec中找,优先从子序列长度大的开始找,就是cur开始,依次--,直到找到for (int j = cur; j >= 1; j--){// 找到vec[j]比nums[i]小,并且子序列长度为jif (vec[j] < nums[i]){// 如果j是最长长度,那么我加入nums[i]后必要最长长度+1,所以这里push_backif (j + 1 > cur){vec.push_back(nums[i]);cur++;}// 否则,判断相同长度,这个nums[i]是否比vec[j+1]小,如果小,那么用它代替为vec[j+1](为什么是j+1?因为加入nums[i]后长度要+1)else if (vec[j + 1] > nums[i])vec[j + 1] = nums[i];// 置flag=false,表示找到了比nums[i]小的元素flag = false;break;}}// 如果没找到比nums[i]小的元素,那么说明nums[i]要单独作为一个子序列的起始元素,长度为1if (flag){// 这时同样将它与vec[1]的元素比较,放入最小的才能保证之后有更大的机会组成最长子序列if (vec[1] > nums[i])vec[1] = nums[i];}}return cur; //返回vec的长度即可,表示最长递增子序列的长度
}
Leetcode动态规划:300.longest-increasing-subsequence(最长递增子序列)相关推荐
- C++longest increasing subsequence 最长递增子序列的实现之二(附完整源码)
C++longest increasing subsequence 最长递增子序列的实现 C++longest increasing subsequence 最长递增子序列的的实现完整源码(定义,实现 ...
- C++longest increasing subsequence 最长递增子序列的实现之一(附完整源码)
C++longest increasing subsequence 最长递增子序列的实现 C++longest increasing subsequence 最长递增子序列的的实现完整源码(定义,实现 ...
- 300 Longest Increasing Subsequence 最长上升子序列
给出一个无序的整形数组,找到最长上升子序列的长度. 例如, 给出 [10, 9, 2, 5, 3, 7, 101, 18], 最长的上升子序列是 [2, 3, 7, 101],因此它的长度是4.因为可 ...
- Leetcode300. Longest Increasing Subsequence最长上升子序列
给定一个无序的整数数组,找到其中最长上升子序列的长度. 示例: 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4. 说 ...
- 【暴力】LeetCode 300. Longest Increasing Subsequence
LeetCode 300. Longest Increasing Subsequence Solution1:我的答案 暴力搜索,时间复杂度O(n2)O(n2)O(n^2) class Solutio ...
- C++longest common subsequence最长公共子序列的实现(附完整源码)
C++longest common subsequence最长公共子序列 longest common subsequence最长公共子序列的完整源码(定义,实现,main函数测试) longest ...
- leetcode 300. Longest Increasing Subsequence | 300. 最长递增子序列(动态规划)
题目 https://leetcode.com/problems/longest-increasing-subsequence/ 题解 难得有官方题解的一道题. 参考:https://leetcode ...
- [leetcode] 300. Longest Increasing Subsequence (Medium)
题意: 求最长增长的子序列的长度. 思路: 利用DP存取以i作为最大点的子序列长度. Runtime: 20 ms, faster than 35.21% of C++ online submissi ...
- 动态规划设计方法详解最长递增子序列
很多读者反应,就算看了前文动态规划详解,了解了动态规划的套路,也不会写状态转移方程,没有思路,怎么办?本文就借助「最长递增子序列」来讲一种设计动态规划的通用技巧:数学归纳思想. 最长递增子序列(Lon ...
- leetcode 1143. Longest Commom Subsequence 最长公共子序列(中等)
一.题目大意 标签: 动态规划 https://leetcode.cn/problems/longest-common-subsequence 给定两个字符串 text1 和 text2,返回这两个字 ...
最新文章
- 怎样成为php高手,怎么成为php高手?如何自学成为php高手?优秀的PHP开发者是怎样炼成的?-PHP教程-基础篇-php语法基础--创业的风,吹向了年轻之长藤个人博客网站...
- Postman:Postman(HTTP的测试工具)使用方法详细攻略
- sql2005导出Excel错误解决方法
- could not open C:\Program Files\Java\jdk1.6.0-11\lib\i386\jvm.cfg
- java 队列复制_java - 复制堆栈或队列,而无需使用“克隆” - 堆栈内存溢出
- 漫谈LiteOS-LiteOS SDK支持RISC-V架构
- BootStrap中Model模态框点击除了×号和关闭按钮外的其他区域不消失
- python安装sqlalchemy python2_Python SQLAlchemy --2
- 快速学会require的使用
- 《推荐系统实践》算法纯享(附代码链接)(六)—— 借助社交网络推荐篇
- Java 图片URL转Base64编码
- 博主已开启评论精选什么意思_双十一前夕,小红书砸掉了博主的饭碗
- New B2CShop - Code Smith 修改
- 浏览器极速模式和兼容模式差异 1
- 从零开始 飞机大战(五)实现子弹定位和动画
- 【你好,windows】嵌入式win8.1 X86X64企业纯净版安装版2019.6.20
- 线性代数考研笔记(一)
- java中的smm_smm框架下的JAVA玩友交流网站
- 微软Windows CEO梅尔森跟全体员工告别
- Navicat工具怎么得到MySQL数据库EXCEL表结构