当前位置: 首页 > news >正文

定个小目标之刷LeetCode热题(28)

300. 最长递增子序列

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

示例 1:

输入:nums = [10,9,2,5,3,7,101,18]

输出:4

解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。


今天是刷这道题,看题目名称就能猜到要用到动态规划思想,本题使用动态规划+二分查找进行求解,定义一个dp[i]数组,其含义表示以nums[i]结尾的递增子序列的长度为i,那么我们遍历数组,每遇到nums[i] < nums[j]时就将其放入dp数组,即dp[++i] = nums[j],如果遇到nums[i] >= nums[j],那么我们需要把dp数组中比nums[j]大的第一个数替换掉,例如下面的nums[]和dp[],会发现2,3,7,8都是递增的,都可以放入到dp[],当遍历到6时,我们需要在dp中寻找第一个比6大的数字,然后把其替换掉,如例子中第一个比6大的数是7,那么我们把7替换为6,在遍历数组过程中我们需要维护一个len用来记录dp[]的最大长度。

nums[]: 2,3,7,8,6,9

dp[]: 2,3,6,8,9

直接上代码如下,代码是使用二分查找在dp数组中找最后一个小于nums[i]的数字,并记录其索引pos,然后 dp[pos + 1] = nums[i]

class Solution {public int lengthOfLIS(int[] nums) {int length = nums.length;if (length == 1)return 1;int[] dp = new int[length + 1];int len = 1;dp[len] = nums[0];for (int i = 1; i < length; i++) {if (dp[len] < nums[i]) {dp[++len] = nums[i];} else {// 在dp数组中二分查找最后一个小于nums[i]的数字,pos记录其下标int l = 1, r = len, pos = 0;while (l <= r) {int mid = (l + r) / 2;if (dp[mid] < nums[i]) {pos = mid;l = mid + 1;} else {r = mid - 1;}}// 把nums[i]放到dp数组中最后一个小于nums[i]元素的后一位dp[pos + 1] = nums[i];}}return len;}
}

题目链接:题单 - 力扣(LeetCode)全球极客挚爱的技术成长平台

相关文章:

  • 孕妈妈如何高效备考PMP,纯经验分享
  • Vue核心指令解析:探索MVVM与数据操作之美
  • SpringBoo+vue3+vite整合讯飞星火3.5通过webscoket实现聊天功能(前端代码)附带展示效果
  • Python爬虫-贝壳新房
  • (一)Kafka 安全之使用 SASL 进行身份验证 —— JAAS 配置、SASL 配置
  • 在线随机密码生成工具
  • 制作微信小程序“飞翔的小鸟”
  • 【Redis】如何保证缓存和数据库的一致性
  • Vue发送http请求
  • 计算机网络之TCP的三次握手和四次挥手
  • webpack 中 require.context() 的用法
  • 力扣刷题笔记
  • Redis连接池配置:深入探索JedisPoolConfig
  • create-react-app创建的项目中设置webpack配置
  • 【科技前沿】电子设计新贵SmartEDA:为何它引领行业风潮?
  • 分享的文章《人生如棋》
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • Android系统模拟器绘制实现概述
  • Django 博客开发教程 8 - 博客文章详情页
  • JS专题之继承
  • Mac转Windows的拯救指南
  • pdf文件如何在线转换为jpg图片
  • session共享问题解决方案
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 浮动相关
  • 记录一下第一次使用npm
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 聊聊redis的数据结构的应用
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 移动端唤起键盘时取消position:fixed定位
  • 7行Python代码的人脸识别
  • Nginx实现动静分离
  • ​2020 年大前端技术趋势解读
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #define、const、typedef的差别
  • #FPGA(基础知识)
  • #HarmonyOS:Web组件的使用
  • #Z0458. 树的中心2
  • $ git push -u origin master 推送到远程库出错
  • $NOIp2018$劝退记
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (26)4.7 字符函数和字符串函数
  • (31)对象的克隆
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (三)模仿学习-Action数据的模仿
  • (十三)Maven插件解析运行机制
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据