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(最长递增子序列)相关推荐

  1. C++longest increasing subsequence 最长递增子序列的实现之二(附完整源码)

    C++longest increasing subsequence 最长递增子序列的实现 C++longest increasing subsequence 最长递增子序列的的实现完整源码(定义,实现 ...

  2. C++longest increasing subsequence 最长递增子序列的实现之一(附完整源码)

    C++longest increasing subsequence 最长递增子序列的实现 C++longest increasing subsequence 最长递增子序列的的实现完整源码(定义,实现 ...

  3. 300 Longest Increasing Subsequence 最长上升子序列

    给出一个无序的整形数组,找到最长上升子序列的长度. 例如, 给出 [10, 9, 2, 5, 3, 7, 101, 18], 最长的上升子序列是 [2, 3, 7, 101],因此它的长度是4.因为可 ...

  4. Leetcode300. Longest Increasing Subsequence最长上升子序列

    给定一个无序的整数数组,找到其中最长上升子序列的长度. 示例: 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4. 说 ...

  5. 【暴力】LeetCode 300. Longest Increasing Subsequence

    LeetCode 300. Longest Increasing Subsequence Solution1:我的答案 暴力搜索,时间复杂度O(n2)O(n2)O(n^2) class Solutio ...

  6. C++longest common subsequence最长公共子序列的实现(附完整源码)

    C++longest common subsequence最长公共子序列 longest common subsequence最长公共子序列的完整源码(定义,实现,main函数测试) longest ...

  7. leetcode 300. Longest Increasing Subsequence | 300. 最长递增子序列(动态规划)

    题目 https://leetcode.com/problems/longest-increasing-subsequence/ 题解 难得有官方题解的一道题. 参考:https://leetcode ...

  8. [leetcode] 300. Longest Increasing Subsequence (Medium)

    题意: 求最长增长的子序列的长度. 思路: 利用DP存取以i作为最大点的子序列长度. Runtime: 20 ms, faster than 35.21% of C++ online submissi ...

  9. 动态规划设计方法详解最长递增子序列

    很多读者反应,就算看了前文动态规划详解,了解了动态规划的套路,也不会写状态转移方程,没有思路,怎么办?本文就借助「最长递增子序列」来讲一种设计动态规划的通用技巧:数学归纳思想. 最长递增子序列(Lon ...

  10. leetcode 1143. Longest Commom Subsequence 最长公共子序列(中等)

    一.题目大意 标签: 动态规划 https://leetcode.cn/problems/longest-common-subsequence 给定两个字符串 text1 和 text2,返回这两个字 ...

最新文章

  1. 怎样成为php高手,怎么成为php高手?如何自学成为php高手?优秀的PHP开发者是怎样炼成的?-PHP教程-基础篇-php语法基础--创业的风,吹向了年轻之长藤个人博客网站...
  2. Postman:Postman(HTTP的测试工具)使用方法详细攻略
  3. sql2005导出Excel错误解决方法
  4. could not open C:\Program Files\Java\jdk1.6.0-11\lib\i386\jvm.cfg
  5. java 队列复制_java - 复制堆栈或队列,而无需使用“克隆” - 堆栈内存溢出
  6. 漫谈LiteOS-LiteOS SDK支持RISC-V架构
  7. BootStrap中Model模态框点击除了×号和关闭按钮外的其他区域不消失
  8. python安装sqlalchemy python2_Python SQLAlchemy --2
  9. 快速学会require的使用
  10. 《推荐系统实践》算法纯享(附代码链接)(六)—— 借助社交网络推荐篇
  11. Java 图片URL转Base64编码
  12. 博主已开启评论精选什么意思_双十一前夕,小红书砸掉了博主的饭碗
  13. New B2CShop - Code Smith 修改
  14. 浏览器极速模式和兼容模式差异 1
  15. 从零开始 飞机大战(五)实现子弹定位和动画
  16. 【你好,windows】嵌入式win8.1 X86X64企业纯净版安装版2019.6.20
  17. 线性代数考研笔记(一)
  18. java中的smm_smm框架下的JAVA玩友交流网站
  19. 微软Windows CEO梅尔森跟全体员工告别
  20. Navicat工具怎么得到MySQL数据库EXCEL表结构

热门文章

  1. 7-1 抓老鼠啊~是亏了还是赚了?
  2. .net core webapi 文件上传在 Swagger 文档中的有好提示处理
  3. Python代码转换为exe可执行程序详解
  4. 开博客第一天!!来几句鸡汤
  5. 背景透明,文字不透明效果
  6. WinForm------TreeList修改节点图标和按钮样式
  7. pku1189 钉子和小球
  8. SSLOJ 1335.蛋糕切割
  9. javascript控制开始日期,和结束日期在同一个月
  10. 团队转会名单(22日改)