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

1.题目

描述

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

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

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

数据范围: 0≤n≤1000

要求:时间复杂度 O(n^2^), 空间复杂度 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"都是合法的子序列。

具体思路如下:

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

3.编码实现

核心代码如下:

Go 复制代码
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,对于每一个元素来说,如果只有此元素本身,最长递增子序列为1
	for 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++ {
			//数组序列上升则更新dp
			if 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
}

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

4.总结

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

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

  ✅ 链表

  ✅ 二叉树

  ✅ 二分查找、排序

  ✅ 堆、栈、队列

  ✅ 回溯算法

  ✅ 哈希算法

  ✅ 动态规划

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

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

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

相关推荐
UIU1147 小时前
P1233 [ICPC 2001 Taejon R] 木棍加工
数据结构·c++·算法·动态规划
论文复现现场7 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
ZhengEnCi7 小时前
用 AI 写代码为什么拼到最后还是拼人:算力瓶颈与领域专家提示词的本质差异
算法·架构
秋天的怀念_David8 小时前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法
碧海银沙音频科技研究院9 小时前
在PC电脑上用Whisper→Marian算法实现离线语音翻译功能
算法·whisper
niyongsheng9 小时前
3D 装箱算法工程化:数据结构、放置启发式与支撑规则
数据结构·算法·rust
叉烧滑蛋11 小时前
B站台湾大学郭彦甫|MATLAB 学习笔记|04 变量与档案存取
数据结构
j7~12 小时前
【穷举、深搜与回溯算法】一棵决策树讲透全排列与子集
数据结构·c++·算法·leetcode·回溯·递归
傅科摆 _ py13 小时前
DP,贪心,堆和栈,二分力扣复习
开发语言·python·算法
Shaoshing13 小时前
LeetCode100 42.接雨水
java·算法·leetcode