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

LeetCode-热题100: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 。

示例 2:

输入: nums = [0,1,0,3,2,3]
输出: 4

示例 3:

输入: nums = [7,7,7,7,7,7,7]
输出: 1

提示:

  • 1 <= nums.length <= 2500
  • -104 <= nums[i] <= 104

代码及注释

func lengthOfLIS(nums []int) int {// 创建一个动态规划数组 dp,其中 dp[i] 表示以 nums[i] 结尾的最长上升子序列的长度dp := make([]int, len(nums))// 初始化结果为 1,因为每个单独的元素本身就是一个长度为 1 的上升子序列res := 1// 初始化 dp 数组的第一个元素为 1dp[0] = 1// 遍历整个数组for i := 1; i < len(nums); i++ {// 初始化 dp[i] 为 1,因为单个元素本身就是一个长度为 1 的上升子序列dp[i] = 1// 遍历当前元素之前的所有元素for j := 0; j < i; j++ {// 如果当前元素大于前面的某个元素,且加入当前元素后能构成更长的上升子序列if nums[i] > nums[j] {// 更新 dp[i],取当前的 dp[i] 和 dp[j] + 1(加入当前元素后的长度)的较大值dp[i] = max(dp[i], dp[j] + 1)}}// 更新结果 res,取当前的 res 和 dp[i] 的较大值res = max(res, dp[i])}// 返回结果 res,即最长的上升子序列的长度return res
}// 辅助函数,返回两个整数中的较大值
func max(a, b int) int {if a > b {return a}return b
}

代码解释

动态规划数组 dp

在这个问题中,我们使用动态规划来解决。我们定义了一个 dp 数组,其中 dp[i] 表示以 nums[i] 结尾的最长上升子序列的长度。通过这种方式,我们可以迭代地计算更长的上升子序列,并找到最长的一个。

1.初始化
  • 初始化 dp[0] 为 1,因为单个元素本身就是一个长度为 1 的上升子序列。
2.状态转移
  • 对于每个 nums[i],我们需要检查之前的所有元素 nums[j]j < i)。如果 nums[i] > nums[j],则说明我们可以将 nums[i] 加入到以 nums[j] 结尾的子序列中,从而构成一个更长的上升子序列。

  • 因此,我们更新 dp[i] = max(dp[i], dp[j] + 1)

3.更新结果
  • 每次更新 dp[i] 后,我们都更新全局的最长上升子序列长度 res

相关文章:

  • 论文阅读——MVDiffusion
  • 【代码随想录】day38
  • 基于SpringBoot+Vue+Mysql的图书管理系统
  • 3.10 Python数据类型转换
  • ubuntu sudo时候LD_LIBRARY_PATH设置问题
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • Spring声明式事务(Spring学习笔记十三)
  • 腾讯云故障,该如何规避?
  • 前台往后台传值,null到后台变成了undefined ,NaN到了后台变成了null
  • IMBoy缓存系统深度解析:为何选择depcache而非ETS或Redis
  • 基于单片机数码管20V电压表仿真设计
  • LeetCode-热题100:152. 乘积最大子数组
  • 自动驾驶中的传感器融合算法:卡尔曼滤波器和扩展卡尔曼滤波器
  • 无人机飞行知识
  • Vue的模块化开发初探
  • 「译」Node.js Streams 基础
  • input的行数自动增减
  • java8 Stream Pipelines 浅析
  • Javascript设计模式学习之Observer(观察者)模式
  • Java精华积累:初学者都应该搞懂的问题
  • laravel with 查询列表限制条数
  • PHP那些事儿
  • Spring框架之我见(三)——IOC、AOP
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • WebSocket使用
  • win10下安装mysql5.7
  • windows-nginx-https-本地配置
  • 程序员该如何有效的找工作?
  • 深度学习在携程攻略社区的应用
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 原生js练习题---第五课
  • 怎么把视频里的音乐提取出来
  • Hibernate主键生成策略及选择
  • MPAndroidChart 教程:Y轴 YAxis
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • ​什么是bug?bug的源头在哪里?
  • (1)SpringCloud 整合Python
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (差分)胡桃爱原石
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (第61天)多租户架构(CDB/PDB)
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (十)c52学习之旅-定时器实验
  • (四)opengl函数加载和错误处理
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .gitignore
  • .gitignore文件忽略的内容不生效问题解决
  • .gitignore文件---让git自动忽略指定文件
  • .htaccess配置重写url引擎
  • .NET Core WebAPI中使用swagger版本控制,添加注释