动态规划系列之「最长递增子序列的个数」

2023-10-27

673. 最长递增子序列的个数

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

示例 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。

注意: 给定的数组长度不超过 2000 并且结果一定是32位有符号整数。

「最长递增子序列」那道题谁让求最长子序列的长度,这道题是求个数。

思路

首先要定义 dp 数组的含义:

len[i] 表示以 nums[i] 这个数结尾的最长递增子序列的长度

cnt[i] 表示以 nums[i] 这个数结尾的,且最长递增子序列为len[i]的组合数

index 0 1 2 3 4 5
nums 1 3 5 4 7 6
len 1 2 3 3 4 4
cnt 1 1 1 1 2 2

nums[i]为结尾,那么肯定要找前面比nums[i]小的。

cnt[i] = 所有的前面比nums[i]小的,且等于len[i]-1len[j]的个数

比如上面的例子:

cnt[3]

  • len[3]-1 等于 2

  • 然后找索引3之前的比nums[3]=4小且dp[j]为2的nums[j]

  • 最终找到一个,即len[1]=2

  • cnt[3]=1

简而言之就是:cnt[i] 等于 len[j]的个数,只不过这个len[j]要满足三个条件:

  1. i < j
  2. nums[j] < nums[i]
  3. len[j] == len[i] -1

最后返回的结果:

  • 先求得len[]的最大值MAX
  • 返回所有len[]中等于MAX的索引所对应的cnt的和

最终代码如下:

class Solution {
    public int findNumberOfLIS(int[] nums) {
        int LEN = nums.length;
        int[] len = new int[LEN];
        int[] cnt = new int[LEN];
        Arrays.fill(len, 1);
        Arrays.fill(cnt, 1);
    
        for(int i = 1; i < LEN; i++){
            for(int j = 0; j < i; j++){
                if(nums[j] < nums[i]){
                    if(len[j] > len[i] - 1){
                        len[i] = len[j] + 1;
                        cnt[i] = cnt[j];
                    }else if(len[j] == len[i] - 1){
                        cnt[i] += cnt[j];
                    }
                }
                
            }
        }
        // 只需遍历一遍就可找出dp数组中最大值的个数
        int MAX = 0; // 保存当前最大值
        int res = 0;  // 保存当前最大值的个数
        for(int i = 0; i < LEN; i++){
            MAX = Math.max(MAX, len[i]);
        }
        for(int i = 0; i < LEN; i++){
            if(len[i] == MAX){
                res += cnt[i];
            }
        }
        return res;
        
    }
}

时间复杂度:O(N^2)
空间复杂度:O(N)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态规划系列之「最长递增子序列的个数」 的相关文章

随机推荐

  • Hive初始化报错:org.apache.hadoop.hive.metastore.HiveMetaException: Failed to load driver

    Hive初始化报错 org apache hadoop hive metastore HiveMetaException Failed to load driver 完整错误如下所示 org apache hadoop hive metas
  • GAN网络的重新学习的一些内容记录

    20211130 本篇文章属于自己在学习过程中的一些内容记录 正是因为对这些内容不理解 才有了这篇文章 同时会记录一些自己的思考 对与错请仔细斟酌 0 引言 经过了一年多 上次专门研究GAN是去年的时候 学习了基础的原理 也记录了一些文章
  • 架构-负载均衡

    互联网常见的分布式加构分层 1 客户端层 浏览器 APP 小程序 等 2 反向代理层 Nginx 3 站点层 web server 4 服务层 service dubbo webservic 5 数据层 DB 这五个分层的负载均衡策略 1
  • typescript版本的扫雷游戏设计(思路+代码)

    思路 生成图片矩阵 点击格子 如果 第一次 且 新游戏 生成除该格子外的雷图 统计数字 如果 该格子是雷 爆炸 否则 如果 格子数字是0 深度搜索0区域 加入展示区域 如果格子已经打开 忽略 如果格子标识旁边有雷 把该格子加入展示区域 打开
  • 动画程序时长缩放是什么意思_修手机的朋友说:安卓机这样设置,感受跟苹果一样的过渡动画...

    众所周知 IOS系统的过渡动画是出了名的丝滑 因为就在安卓系统挤破脑袋追求流畅时 苹果工程师竟然反其道而行的降低了手机响应频率 这就导致iPhone的使用者在不同页面和软件切换时能明显感知到一个从慢到快的过程 这项功能在原厂的安卓系统上是没
  • 值得一看的技术类书籍

    1 linux 书 Debug Hacks中文版 深入调试的技术和工具
  • C语言开发MicroPython模块(向module添加type)

    MicroPython向module添加type的方法 以及向type添加function的方法都是按照定义好的固定框架进行添加 module添加type的代码格式如下 include stdint h include stdio h in
  • M2芯片安装Anaconda和pytorch

    记录安装过程中遇到的问题 希望帮助到同样用mac的朋友 1 安装好Anaconda后 在启动台无法打开navigator 解决办法 终端输入 which anaconda navigator 返回navigator所在位置 command
  • SpringCloud Stream @EnableBinding注解过时

    EnableBinding源码中明确声明 该注解在从3 1版本开始被弃用 推荐我们使用函数编程的方式 我将给出一个生产者和消费者的使用案例 生产者案例 yml配置 server port 8801 spring application na
  • 最最最详细的springboot项目中集成微信扫码登入功能.步骤代码超级详细(OAuth2)

    说到登录注册 就会想到先要注册一个用户名 在进行登入 但是现在大多数的网站都集成了微信登入 不需要注册 给你一个二维码 微信一扫直接登录 这确实是十分便捷的 所以我们会尽量在项目中实现这一功能 减少用户操作 提高用户产品体验 由于微信是腾讯
  • MIPS架构下linux软浮点研究

    转自 http blog sina com cn s blog 67b113a10100zxx3 html 在嵌入式领域 为了节省成本和减少功耗 很多芯片都是没有浮点运算模块的 一般该模块叫做FPU float process unit 这
  • 爬虫写得好,牢饭吃到饱?

    先说一条新闻 一家专注大数据的数据服务提供商公司巧达科技 因为大量使用爬虫访问其他公司接口获取数据 整个公司被抓 最后不光管理者 干活的程序员也被抓了 很多学python的同学都接触过爬虫 即便是没接触过应该也听过 看到这种新闻你会不会心里
  • MySQL管理常用工具介绍

    1 mysql 该mysql不是指mysql服务 而是指mysql的客户端工具 e选项可以在Mysql客户端执行SQL语句 而不用连接到MySQL数据库再执行 对于一些批处理脚本 这种方式尤其方便 示例 2 mysqladmin mysql
  • 第一启富金:两大利空压顶 黄金受压收跌

    第一启富金官网显示 全球最大黄金上市交易基金 ETF 截至01月19日持仓量为976 21吨 较上日持平 本月止净增持0 55吨 香港第一金 投资者的注意力仍集中在美联储1月25日至26日的会议上 此前美联储官员暗示 他们将在3月开始加息以
  • Spring-MVC的文件上传下载,及插件的使用(让项目开发更节省时间)

    目录 一 概述 1 介绍 2 讲述 二 上传 三 下载 四 jrebel的使用 五 多文件上传 给我们带来什么收获 一 概述 1 介绍 Spring MVC的文件上传下载是指在Spring MVC框架中实现文件的上传和下载功能 文件上传是指
  • 【Python基础】深拷贝,浅拷贝和赋值

    浅拷贝 在含有多层对象的字典 列表 集合中 浅拷贝只拷贝父对象 不会拷贝父对象内部的可变子对象 语法 copy copy 深拷贝 只要被拷贝对象含有可变子对象 程序就会重新申请一块内存空间把被拷贝对象的值复制一份存放到该内存空间中 语法 c
  • 前端面试话术集锦第 15 篇:高频考点(React常考进阶知识点)

    这是记录前端面试的话术集锦第十五篇博文 高频考点 React常考进阶知识点 我会不断更新该博文 1 HOC 是什么 相比 mixins 有什么优点 很多人看到高阶组件 HOC 这个概念就被吓到了 认为这东西很难 其实这东西概念真的很简单 我
  • JAVA基础day04

    package com atguigu exer 1 创建一个名为TestArray的类 在main 方法中声明array1和array2两个变量 他们是int 类型的数组 2 使用大括号 把array1初始化为8个素数 2 3 5 7 1
  • redis优化-5.redis主从复制问题处理

    1 读写分离 1 1复制数据延迟 Redis复制数据的延迟由于异步复制特性是无法避免的 延迟取决于网络带宽和命令阻塞情况 比如刚在主节点写人数据后立刻在从节点上读取可能获取不到 需要业务场景允许短时间内的数据延迟 对于无法容忍大量延迟场景
  • 动态规划系列之「最长递增子序列的个数」

    673 最长递增子序列的个数 给定一个未排序的整数数组 找到最长递增子序列的个数 示例 1 输入 1 3 5 4 7 输出 2 解释 有两个最长递增子序列 分别是 1 3 4 7 和 1 3 5 7 示例 2 输入 2 2 2 2 2 输出