题目描述

给出一个无序的整形数组,找到最长上升子序列的长度。

例如,

给出 [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)相关推荐

  1. LeetCode——1143. 最长公共子序列(Longest Common Subsequence)[中等]——分析及代码(Java)

    LeetCode--1143. 最长公共子序列[Longest Common Subsequence][中等]--分析及代码[Java] 一.题目 二.分析及代码 1. 动态规划 (1)思路 (2)代 ...

  2. leetcode数组汇总_[LeetCode] 300. 最长上升子序列

    题目链接: https://leetcode-cn.com/problems/longest-increasing-subsequence 难度:中等 通过率:43.0% 题目描述: 给定一个无序的整 ...

  3. leetcode - 300. 最长上升子序列

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

  4. Leetcode 300.最长上升子序列(求长度)

    Time: 20190906 Type: Medium 题目描述 给定一个无序的整数数组,找到其中最长上升子序列的长度. 示例: 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: ...

  5. 111. Leetcode 300. 最长递增子序列 (动态规划-子序列问题)

    步骤一.确定状态: 确定dp数组及下标含义 dp是长度为len(nums)的数组,dp[i]表示以nums[i]结尾的最长子序列的长度, 这个定义中 nums[i] 必须被选取,且必须是这个子序列的最 ...

  6. Leetcode 300 最长递增子序列 (每日一题 20210803)

    给你一个整数数组 nums ,找到其中最长严格递增子序列的长度.子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序.例如,[3,6,2,7] 是数组 [0,3,1,6,2 ...

  7. Leetcode——300. 最长上升子序列

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

  8. leetcode 300. 最长上升子序列

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

  9. LeetCode 300. 最长上升子序列(动态规划)

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

最新文章

  1. Codeforces Round #650 (Div. 3)(A-F1)题解
  2. 有5个学生,4门课程,用子函数的方法显示平均分最高的学生的所有成绩
  3. 帝国cms栏目忘记设置为终极栏目怎么办?
  4. opencv计算两数组的乘积_opencv矩阵运算(2)
  5. bcb 如何在DLL中捕捉系统级异常
  6. 一个countDown在多线程调度下使用不当的分享
  7. openwrt源码分析_openwrt 15.05.1源码
  8. 500位全球算法开发者零奖金参加阿里云天池大赛 AI预测台风助力防灾减灾
  9. Python爬虫知识点四--scrapy框架
  10. BZOJ 2683: 简单题(CDQ 分治)
  11. 联想第三季:PC+时代的航母启航?
  12. 项目管理(PMBOK第六版)常用缩写中英文对照
  13. 信息安全技术及应用 互联网安全协议
  14. 省市县联动列表html代码,若依添加省市县联动三级菜单
  15. 【论文写作技巧】Endnote参考文献统一输出格式
  16. Base64解码文件下载
  17. 无法为立即文档创建临时文件: 设备上没有空间(centos root 目录爆满)
  18. Codeup1032-1033、1045
  19. 使用 JS 循环解决经典数学问题!
  20. 代码审计系列:熊海CMS V1.0 (iseaCMS_1.0)

热门文章

  1. js 语法:JSON.stringify(data, null, 4)
  2. Linux scp -r命令主机间文件复制
  3. solr怎么设置搜索结果排名靠前?
  4. MySQL官方提供的测试数据库脚本和数据文件下载
  5. 使用pil读取gif图有些位置为黑色_使用 Pillow 快速创建 GIF 动图
  6. ARM 之五 发展史及各时期内核(ARM1 ~ ARM11 / Cortex)介绍
  7. ‘a’、“a”、‘abc’和“abc”的区别
  8. C typedef功能介绍(内附函数指针和指针函数的区别)
  9. 启明云端分享|乐鑫推出在线选型工具 ESP Product Selector
  10. 求最大素数的c语言,for语句计算输出10000以内最大素数怎么搞最简单??各位大神们...