杭州营销型网站建设滁州网站建设

南京永润网络科技有限公司 2026/09/09 18:28:46

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
  • -10^4 <= nums[i] <= 104

思路:
1.dp数组及其下标含义:这是本题的重中之重,本题的dp[i]表示i之前包括nums[i]结尾的最长递增子序列

2.状态转移方程:位置i的最长递增序列,等于 j 从 0 到 i - 1的最长递增序列 + 1(位置i本身),也就是我们去找最大的dp[j] + 1,

if (nums[i] > nums[j]) {

dp[i] = Math.max(dp[i], dp[j] + 1)

}

3.dp数组的初始化:所有位置最开始起码都是1,所以全部初始化为1

4.确定遍历顺序:本题一共有两层for循环,外层遍历i,内层遍历j,外层遍历的i是一定要从小到大遍历的,要不然拿不到前面的数据,内层的j无所谓从前还是从后,只要是0到i - 1这个范围就行了

5.举例推导dp数组

输入:[0,1,0,3,2],dp数组的变化如下:

如果代码写出来,但一直AC不了,那么就把dp数组打印出来,看看对不对!

代码示例:

function lengthOfLIS(nums: number[]): number { const length: number = nums.length const dp: number[] = new Array(length).fill(1) let res: number = 0 for (let i = 0; i < length; i++) { for (let j = 0; j < i; j++) { if (nums[i] > nums[j]) { dp[i] = Math.max(dp[i], dp[j] + 1) } } res = Math.max(res, dp[i]) } return res };

674.最长连续递增数列

文章讲解/视频讲解

题目描述:

给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。

连续递增的子序列 可以由两个下标 l 和 r(l < r)确定,如果对于每个 l <= i < r,都有 nums[i] < nums[i + 1] ,那么子序列 [nums[l], nums[l + 1], ..., nums[r - 1], nums[r]] 就是连续递增子序列。

示例 1:

  • 输入:nums = [1,3,5,4,7]
  • 输出:3
  • 解释:最长连续递增序列是 [1,3,5], 长度为3。尽管 [1,3,5,7] 也是升序的子序列, 但它不是连续的,因为 5 和 7 在原数组里被 4 隔开。

示例 2:

  • 输入:nums = [2,2,2,2,2]
  • 输出:1
  • 解释:最长连续递增序列是 [2], 长度为1。

提示:

  • 0 <= nums.length <= 10^4
  • -10^9 <= nums[i] <= 10^9

思路:

本题相比上一题其实跟像退阶版本,因为连续意味着我们不必比较nums[j]和nums[i],只需要比较nums[i]和nums[i -1]的大小即可

1.确定dp数组及其下标含义:dp[i]表示以i为结尾的连续递增子序列为dp[i]

2.确定递推公式:如果 nums[i] > nums[i - 1],那么以 i 为结尾的连续递增的子序列长度 一定等于 以i - 1为结尾的连续递增的子序列长度 + 1 。即:dp[i] = dp[i - 1] + 1

3.dp数组的初始化:虽然是连续递增子序列,但是每个序列开始时起码都为1,依旧全部初始化为1

4.确定遍历顺序:由于dp[i]依赖于dp[i - 1],所以一定是从前往后遍历的

5.举例推导dp数组

已输入nums = [1,3,5,4,7]为例,dp数组状态如下:

注意这里要取dp[i]里的最大值,所以dp[2]才是结果!

代码示例:

function findLengthOfLCIS(nums: number[]): number { const length: number = nums.length const dp: number[] = new Array(length).fill(1) let res: number = 1 for (let i = 1; i < length; i++) { if (nums[i] > nums[i - 1]) { dp[i] = dp[i - 1] + 1 } res = Math.max(res, dp[i]) } return res };

718.最长重复子数组

文章讲解/视频讲解

题目描述:

给两个整数数组 A 和 B ,返回两个数组中公共的、长度最长的子数组的长度。

示例:

输入:

  • A: [1,2,3,2,1]
  • B: [3,2,1,4,7]
  • 输出:3
  • 解释:长度最长的公共子数组是 [3, 2, 1] 。

提示:

  • 1 <= len(A), len(B) <= 1000
  • 0 <= A[i], B[i] < 100

思路:
本题我们考虑用一个二维数组记录两个字符串,这样就能轻松比较二者重复字母

1.确定dp数组及其下标含义:dp[i][j] :以下标i - 1为结尾的A,和以下标j - 1为结尾的B,最长重复子数组长度为dp[i][j]。 (特别注意: “以下标i - 1为结尾的A” 标明一定是 以A[i-1]为结尾的字符串 ),注意这里这么写了就表示dp数组就一定是从dp[1][1]开始的

2.确定递推公式:

根据dp[i][j]的定义,dp[i][j]的状态只能由dp[i - 1][j - 1]推导出来。

即当A[i - 1] 和B[j - 1]相等的时候,dp[i][j] = dp[i - 1][j - 1] + 1;

3.dp数组的初始化:按照dp数组的定义来讲,dp[0][0]其实没有意义,你总不能是以下标-1为结尾的A数组吧。但是为了遍历能正常进行,我们还是把dp[0][0]设置成0,只有这样dp[1][1]才能等于dp[0][0] + 1,后续的dp数组也才能够递增下去

4.确定遍历顺序:本题外层放a还是b其实无所谓,最重要的确保双层循环即可,而且从前往后遍历

5.举例推导dp数组

拿示例1中,A: [1,2,3,2,1],B: [3,2,1,4,7]为例,画一个dp数组的状态变化,如下:

代码示例:

function findLength(nums1: number[], nums2: number[]): number { const length1: number = nums1.length const length2: number = nums2.length const dp: number[][] = new Array(length1 + 1).fill(0).map(_ => new Array(length2 + 1).fill(0)) let res: number = 0 for (let i = 1; i <= length1; i++) { for (let j = 1; j <= length2; j++) { if (nums1[i - 1] === nums2[j - 1]) { dp[i][j] = dp[i - 1][j - 1] + 1 res = Math.max(dp[i][j], res) } } } return res };
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

企业网站建设方案模板网站建设

终极免费方案:彻底解锁百度网盘macOS版下载速度限制【免费下载链接】BaiduNetdiskPlugin-macOSFor macOS.百度网盘 破解SVIP、下载速度限制~项目地址:

2026/06/30 11:28:55

免费网站建设湘潭网站建设

Java生成图片验证码的工具类实现 - 通用安全组件开发指南在现代Web应用中,防止自动化脚本恶意注册、暴力破解或爬虫攻击是系统安全的重要一环。图形验证码作为一道简单而有效的防线

2026/06/30 14:03:08

网站建设合同网站建设解决方案

当机器人智能逐步从单一动作执行走向复杂任务协作,行业对通用机器人能力的期待不断提高。相比模型结构本身,能够真实反映多本体、多任务、多场景操作的数据,正在成为制

2026/06/30 12:02:59

丹阳网站建设马鞍山网站建设

凌晨两点,当室友A第N次起身上厕所,瞥见“卷王”的屏幕:左边开着知网,右边竟不是游戏,而是一个从没见过的智能界面——“他到底在用啥

2026/06/30 10:21:19

静安网站建设崇左网站建设

PaddleDetection实战教程:基于PaddlePaddle镜像的目标检测全流程在智能制造、城市大脑和工业质检日益依赖AI视觉的今天,如何快速构建一个稳定、可复现且

2026/06/30 11:52:58

沈阳网站建设济宁网站建设

Axure RP终极汉化指南:3分钟搞定全中文界面【免费下载链接】axure-cnChinese language file for Axure RP. Axure RP 简体中文语言包

2026/06/30 11:43:57

南昌网站建设资阳网站建设

Dify与私有化部署GPU结合,打造安全可控的大模型服务在金融、医疗和政务等对数据安全高度敏感的行业里,一个共同的挑战浮出水面:如何在享受大语言模型ÿ

2026/06/30 12:19:30

天津网站建设岳阳网站建设

做老房换新实用门窗的品牌精选指南引言老房换新门窗是提升居住品质的重要工程,然而面对众多的门窗品牌,消费者往往不知如何选择。在众多选择中,工厂直营模式的品牌有着

2026/06/30 11:57:28