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

可视化图解算法75:最长上升子序列(最长递增子序列)

1.题目

描述

给定一个长度为 n 的数组 arr,求它的最长严格上升子序列的长度。

所谓子序列,指一个数组删掉一些数(也可以不删)之后,形成的新数组。例如 [1,5,3,7,3] 数组,其子序列有:[1,3,3]、[7] 等。但 [1,1]、[1,3,5] 则不是它的子序列。

我们定义一个序列是 严格上升 的,当且仅当该序列不存在两个下标 i 和 j 满足 i<j 且 arri ≥arrj

数据范围: 0≤n≤1000

要求:时间复杂度 O(n2), 空间复杂度 O(n)

示例1

输入:

[6,3,1,5,2,3,7]

返回值:

4

说明:

该数组最长上升子序列为 [1,2,3,7] ,长度为4

2. 题解思路

本题求解的是最长子序列,因此需要了解子序列与子串的区别。

子串和子序列是计算机科学中常见的两个概念,它们都与字符串或序列的部分内容有关,但存在明显的区别。
子串(Substring)
定义:子串是指原字符串中连续的一段字符组成的序列。换句话说,子串是从原字符串中选取的一个或多个相邻字符构成的新字符串。

特点:子串是连续的,即子串中的字符在原字符串中是连续排列的。子串的长度至少为1,也可以是整个原字符串(即原字符串本身也是它自己的子串)。空字符串(即不包含任何字符的字符串)在某些定义下也被视为任何字符串的子串,但这取决于具体的上下文和定义。

示例:在字符串"abcdefg"中,"abc"、"def"和"cde"都是合法的子串。

子序列(Subsequence
定义:子序列是从原序列中任意选取若干个元素组成的新序列,且这些元素在新序列中的相对顺序与原序列相同,但是允许跳过某些元素。

特点:子序列不一定连续,即子序列中的元素在原序列中可以是不连续的。子序列可以为空,即不选取任何元素。子序列也可以包含原序列的所有元素(此时子序列就等于原序列自身)。

示例:在字符串"abcdefg"中,"aceg"、"adg"和"bdf"都是合法的子序列。

具体思路如下:

75-1

如果文字描述的不太清楚,你可以参考视频的详细讲解。

  • Python版本:https://www.bilibili.com/cheese/play/ep1375305
  • Java版本:https://www.bilibili.com/cheese/play/ep1368531
  • Golang版本:https://www.bilibili.com/cheese/play/ep1368731

3.编码实现

核心代码如下:

func LIS(arr []int) int {//特殊情况if len(arr) == 0 {return 0}//1.定义状态.	i:数组arr的下标; dp[i]:数组arr[0:i]区间内的最长递增子序列dp := make([]int, len(arr))//2.初始化边界条件:dp[i]=1,对于每一个元素来说,如果只有此元素本身,最长递增子序列为1for i := 0; i < len(dp); i++ {dp[i] = 1}res := 1//3.确定递推公式:dp[i]=max(dp[j]+1,dp[i]);arr[i]>arr[j]. 其中,arr[j]为当前元素arr[i]左侧的所有元素for i := 1; i < len(arr); i++ {//查找上升序列for j := 0; j < i; j++ {//数组序列上升则更新dpif arr[i] > arr[j] {dp[i] = max(dp[j]+1, dp[i]) //i需要与多个j进行比较,因此需获取其中最大的dp[i]}}//找到(更新)最大长度res = max(res, dp[i])}//4.输出结果:dp数组中最大的元素return res
}func max(a int, b int) int {if a >= b {return a}return b
}

具体完整代码你可以参考下面视频的详细讲解。

  • Python版本:https://www.bilibili.com/cheese/play/ep1375305
  • Java版本:https://www.bilibili.com/cheese/play/ep1368531
  • Golang版本:https://www.bilibili.com/cheese/play/ep1368731

4.总结

本题求解的是最长子序列,需要明白的是子序列是不连续的。通过动态规划来解决时需要清楚变量i、dp[i]数组的含义,理解递推公式的含义:dp[i]=max(dp[j]+1,dp[i]);arr[i]>arr[j]. 其中,arr[j]为当前元素arr[i]左侧的所有元素。

分割线

《数据结构与算法》深度精讲课程正式上线啦!7 大核心算法模块全解析:

  ✅   链表

  ✅   二叉树

  ✅   二分查找、排序

  ✅   堆、栈、队列

  ✅   回溯算法

  ✅   哈希算法

  ✅   动态规划

无论你是备战笔试面试、提升代码效率,还是突破技术瓶颈,这套课程都将为你构建扎实的算法思维底座。🔥立即加入学习打卡,与千名开发者共同进阶!

  • Python编码实现:https://www.bilibili.com/cheese/play/ss897667807
  • Java编码实现:https://www.bilibili.com/cheese/play/ss161443488
  • Golang编码实现:https://www.bilibili.com/cheese/play/ss63997

对于LeetCode数据结构与算法,我们总结了一套【可视化+图解】方法,依据此方法来解决相关问题,算法变得易于理解,写出来的代码可读性高也不容易出错。具体也可以参考视频详细讲解。

今日佳句:衣带渐宽终不悔,为伊消得人憔悴。

http://www.gsyq.cn/news/153384.html

相关文章:

  • 简易 python 打字计数器
  • 2025年国内家居家纺展示平台口碑推荐榜单有哪些? - 讯息观点
  • 06 让用户输入信息
  • 2025年包装袋厂家权威推荐:环保与本地化双轮驱动,谁在引领行业转型? - 深度智识库
  • 2025全能二维码生成器终极推荐 - 资讯焦点
  • 无界感知动态战场:无人机集群的实时智绘革命 - 品牌2025
  • 2025年PSP钢塑复合压力管厂家权威推荐:陕西保亿达以创新驱动发展 - 深度智识库
  • 陶瓷卫浴定制与加工:选靠谱厂家,享高性价比——广东彩诺卫浴科技有限公司推荐
  • 2025年小型中巴车租赁公司排行榜,推荐比较好的小中巴车租赁公司
  • 4款宝藏护发精油品牌清单:这款稳站修护C位,干枯发必藏 - 资讯焦点
  • 实验室家具制造厂怎么选?松云实验室建设值得关注
  • 实用指南:Cocoa Hugo 主题安装与使用指南
  • 12.26
  • 探索汽车EPB仿真模型:Carsim与Simulink联合仿真之旅
  • 2025钢塑复合压力管厂家推荐榜单:陕西保亿达新材料为何稳居榜首? - 深度智识库
  • 深入解析:讲讲硬、软中断、DMA、网卡 网卡驱动
  • 2025洒水车厂家推荐 产能专利环保三维度权威筛选 - 爱采购寻源宝典
  • 2025年12月智慧实验室系统供应商推荐——厂家实力对比 - 品牌推荐大师1
  • 2025重庆儿童抽动症医院推荐:口碑好、效果佳、服务优的5家优质医院汇总 - 品牌2026
  • 2025方志馆设计机构TOP5权威推荐:专业诚信服务商甄选
  • 2026基桩检测仪/超声基桩检测仪哪家好?支持基桩、地基、岩基抗压静载试验,数据自动双备份。 - 品牌推荐大师1
  • ReAct范式
  • 2025年市面上诚信的空气处理单元厂家哪家靠谱,制热机组/蒸汽换热器/新风空调机组/采暖机组,空气处理单元厂家推荐 - 品牌推荐师
  • 学期回顾
  • 等离子清洗机哪家售后好?上海轩仪深耕等离子清洗机行业多年:售后服务的专业性,看得见更用得着 - 品牌推荐大师
  • 零代码开发微信小程序
  • 2026重庆治疗多动症医院推荐5家专业靠的医院精选 - 品牌2026
  • 2026重庆治疗多动症医院推荐5家专业靠的医院精选 - 品牌2026
  • Vue3 详解
  • CVE-2020-17523