news 2026/4/23 7:06:18

最长递增子序列的个数

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
最长递增子序列的个数

本文参考代码随想录

给定一个未排序的整数数组,找到最长递增子序列的个数。

示例 1:

输入: [1,3,5,4,7]
输出: 2
解释: 有两个最长递增子序列,分别是 [1, 3, 4, 7] 和[1, 3, 5, 7]。
示例 2:

输入: [2,2,2,2,2]
输出: 5
解释: 最长递增子序列的长度是1,并且存在5个子序列的长度为1,因此输出5

思路

动态规划

  1. 确定dp数组(dp table)以及下标的含义
    dp[i]:i之前(包括i)最长递增子序列的长度为dp[i]
    count[i]:以nums[i]为结尾的字符串,最长递增子序列的个数为count[i]

  2. 确定递推公式
    在nums[i] > nums[j]前提下,如果在[0, i-1]的范围内,找到了j,使得dp[j] + 1 > dp[i],说明找到了一个更长的递增子序列。那么以j为结尾的子串的最长递增子序列的个数,就是最新的以i为结尾的子串的最长递增子序列的个数,即:count[i] = count[j]。
    在nums[i] > nums[j]前提下,如果在[0, i-1]的范围内,找到了j,使得dp[j] + 1 == dp[i],说明找到了两个相同长度的递增子序列。
    那么以i为结尾的子串的最长递增子序列的个数 就应该加上以j为结尾的子串的最长递增子序列的个数,即:count[i] += count[j];

  3. dp数组如何初始化
    count[i]记录了以nums[i]为结尾的字符串,最长递增子序列的个数。那么最少也就是1个,所以count[i]初始为1。
    dp[i]记录了i之前(包括i)最长递增序列的长度。最小的长度也是1,所以dp[i]初始为1。

  4. 确定遍历顺序
    dp[i] 是由0到i-1各个位置的最长升序子序列 推导而来,那么遍历i一定是从前向后遍历。
    j其实就是0到i-1,遍历i的循环里外层,遍历j则在内层

classSolution:deffindNumberOfLIS(self,nums:List[int])->int:size=len(nums)ifsize<=1:returnsize dp=[1]*size count=[1]*size max_length=1foriinrange(size):forjinrange(i):ifnums[i]>nums[j]:ifdp[j]+1>dp[i]:dp[i]=dp[j]+1count[i]=count[j]elifdp[j]+1==dp[i]:count[i]+=count[j]ifdp[i]>max_length:max_length=dp[i]max_count=0foriinrange(size):ifmax_length==dp[i]:max_count+=count[i]returnmax_count
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 14:50:13

钥匙和房间

本文参考代码随想录 有 N 个房间&#xff0c;开始时你位于 0 号房间。每个房间有不同的号码&#xff1a;0&#xff0c;1&#xff0c;2&#xff0c;…&#xff0c;N-1&#xff0c;并且房间里可能有一些钥匙能使你进入下一个房间。 在形式上&#xff0c;对于每个房间 i 都有一个…

作者头像 李华
网站建设 2026/4/18 10:26:37

尾调用搞懂了,JS性能直接起飞?前端人别再被面试官问懵了!

尾调用搞懂了&#xff0c;JS性能直接起飞&#xff1f;前端人别再被面试官问懵了&#xff01;尾调用搞懂了&#xff0c;JS性能直接起飞&#xff1f;前端人别再被面试官问懵了&#xff01;为啥每次面试都被问“尾调用优化”&#xff1f;尾调用到底是个啥玩意儿手把手看代码&#…

作者头像 李华
网站建设 2026/4/23 13:57:59

基于真实项目的KeilC51与MDK双环境部署教程

一套能跑通的 Keil C51 与 MDK 共存方案&#xff1a;从踩坑到实战你有没有遇到过这种情况&#xff1a;手头同时在做两个项目&#xff0c;一个是老款 8051 单片机控制板&#xff0c;另一个是基于 STM32 的智能网关。想用 Keil 开发&#xff0c;却发现装了 MDK 后 C51 找不到了&a…

作者头像 李华
网站建设 2026/4/23 15:30:59

Keil安装教程图解说明:从下载到环境部署全流程

从零开始搭建Keil开发环境&#xff1a;手把手带你完成安装、配置与避坑指南 你是不是也曾在第一次接触嵌入式开发时&#xff0c;面对“Keil怎么装&#xff1f;”“为什么编译报错&#xff1f;”“程序烧不进去怎么办&#xff1f;”这些问题一头雾水&#xff1f;别担心&#xf…

作者头像 李华
网站建设 2026/4/23 12:21:40

从零实现STM32高精度定时的时钟树设置

手把手教你配置STM32高精度定时&#xff1a;从时钟树到定时器中断的完整链路你有没有遇到过这样的问题&#xff1f;明明写好了1ms的定时任务&#xff0c;结果实测发现每隔一段时间就“卡”一下&#xff1b;或者用HAL_Delay()控制PWM波形&#xff0c;却发现频率忽快忽慢。更离谱…

作者头像 李华
网站建设 2026/4/23 12:25:31

提示工程架构师:设计灵活的AI提示系统反馈与响应机制

提示工程架构师&#xff1a;设计灵活的AI提示系统反馈与响应机制——让AI从“答对题”到“会聊天” 关键词 提示工程架构、反馈闭环机制、动态Prompt生成、上下文感知、多模态响应、Prompt版本控制、强化学习优化 摘要 你有没有过这样的体验&#xff1f;跟AI聊天时&#xff0c;…

作者头像 李华