(动态规划) 673. 最长递增子序列的个数 ——【Leetcode每日一题】

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

难度:中等

给定一个未排序的整数数组 nums , 返回最长递增子序列的个数 。

注意 这个数列必须是 严格 递增的。

示例 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 < = n u m s . l e n g t h < = 2000 1 <= nums.length <= 2000 1<=nums.length<=2000
  • − 1 0 6 < = n u m s [ i ] < = 1 0 6 -10^6 <= nums[i] <= 10^6 106<=nums[i]<=106

💡思路:动态规划

定义 dp 数组,dp[i] 表示 nums 中前 i(包括 nums[i] )最长递增子序列的长度;

并定义 count 数组,表示以 nums[i] 为结尾的字符串,最长递增子序列的个数为 count[i]

  • 遍历 nums 数组,当遍历 nums[i] 时,将nums[i][0, i - 1] 中的数进行比较,当 nums[i] > nums[j]时:

    • 如果 dp[j] + 1 > dp[i],说明找到了一个更长的递增子序列,则更新 dp[i] = dp[j] + 1 ,此时以 j 为结尾的子串的最长递增子序列的个数,就是最新的以 i 为结尾的子串的最长递增子序列的个数,即:count[i] = count[j]
    • dp[j] + 1 == dp[i],说明找到了两个相同长度的递增子序列,那么以 i 为结尾的子串的最长递增子序列的个数 就应该加上以 j 为结尾的子串的最长递增子序列的个数,即:count[i] += count[j]
  • 题目要求最长递增序列的长度的个数,我们定义一个变量 maxCount 把最长长度记录下来;

  • 最后统计所有等于 maxCount长度的 数量。

🍁代码:(C++、Java)

C++

class Solution {
public:int findNumberOfLIS(vector<int>& nums) {if (nums.size() <= 1) return nums.size();int n = nums.size();vector<int> dp(n, 1); //i之前(包括i)最长递增子序列的长度vector<int> count(n, 1); //以nums[i]为结尾的字符串,最长递增子序列的个数int maxCount = 0;for(int i = 0; i < n; i++){for(int j = 0; j < i; j++){if(nums[i] > nums[j]){if(dp[j] + 1 > dp[i]) {dp[i] = dp[j] + 1;count[i] = count[j];}else if(dp[j] + 1 == dp[i]) count[i]+= count[j];}if (dp[i] > maxCount) maxCount = dp[i];}}int result = 0;for (int i = 0; i < n; i++) {if (maxCount == dp[i]) result += count[i];}return result;}
};

Java

class Solution {public int findNumberOfLIS(int[] nums) {int n = nums.length;if(n <= 1) return n;int dp[] = new int[n]; //i之前(包括i)最长递增子序列的长度Arrays.fill(dp, 1);int count[] = new int[n]; //以nums[i]为结尾的字符串,最长递增子序列的个数Arrays.fill(count, 1);int maxCount = 0;for(int i = 0; i < n; i++){for(int j = 0; j < i; j++){if(nums[i] > nums[j]){if(dp[j] + 1 > dp[i]) {dp[i] = dp[j] + 1;count[i] = count[j];}else if(dp[j] + 1 == dp[i]) count[i]+= count[j];}if (dp[i] > maxCount) maxCount = dp[i];}}int result = 0;for (int i = 0; i < n; i++) {if (maxCount == dp[i]) result += count[i];}return result;}
}

🚀 运行结果:

在这里插入图片描述

🕔 复杂度分析:

  • 时间复杂度 O ( n 2 ) O(n^2) O(n2),其中 n 为数组 nums的长度。
  • 空间复杂度 O ( n ) O(n) O(n)

题目来源:力扣。

放弃一件事很容易,每天能坚持一件事一定很酷,一起每日一题吧!
关注我LeetCode主页 / CSDN—力扣专栏,每日更新!

注: 如有不足,欢迎指正!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/3789.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【http服务】使用命令来查看和停止端口

需求: 在Windows 10上&#xff0c;使用命令来查看和停止端口8000上的进程。 方法&#xff1a; 要查看所有端口以及它们所属的进程&#xff0c;您可以使用以下命令&#xff1a; Get-NetTCPConnection | Select-Object LocalPort, OwningProcess这将显示所有TCP连接的本地端口…

游戏陪玩语音聊天系统3.0商业升级独立版本源码

首发价值29800元的最新商业版游戏陪玩语音聊天系统3.0商业升级独立版本源码 1、增加人气店员轮播 2、优化ui界面丨优化游戏图标展示丨优化分类展示 3、增加动态礼物打赏功能 4、增加礼物墙功能 增加店员满足业绩&#xff0c;才能升级功能 5、增加店员等级不同&#xff0c;可接…

软件测试的概念与过程----学习软件测试前的思考

软件测试的概念与过程----学习软件测试前的思考 1、软件测试工作是做什么的&#xff1f;2、那我做软件测试拿到一个软件产品我应该从哪里测试&#xff0c;怎末开始工作&#xff1f;3、测试早做好还是晚一些做好&#xff1f;4、软件测试能将软件测试的一点问题都没有嘛&#xff…

Day43

思维导图 深拷贝和浅拷贝 1> 如果类中有指针成员时&#xff0c;如果没有显性的定义拷贝构造和拷贝赋值函数&#xff0c;系统默认提供的都只能实现浅拷贝&#xff0c;需要显性定义出深拷贝函数&#xff0c;为了完成指针成员的独立赋值&#xff0c;如果类中没有指针成员&#…

【实战】 二、React 与 Hook 应用:实现项目列表 —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(二)

文章目录 一、项目起航&#xff1a;项目初始化与配置二、React 与 Hook 应用&#xff1a;实现项目列表1.新建文件2.状态提升3.新建utils4.Custom Hook 学习内容来源&#xff1a;React React Hook TS 最佳实践-慕课网 相对原教程&#xff0c;我在学习开始时&#xff08;2023.0…

浅浅总结一下雅思听力技巧

1. 地图题 读题步骤要明确 &#xff08;1&#xff09;看图&#xff0c;要看看题目中是否有东南西北的标志&#xff0c;如果有的话&#xff0c;那么大概率题目中就会用到。同时也标记好左右的标志&#xff0c;防止考试的时候太紧张分不清。 弄清楚个元素的相对位置&#xff0…

Python web框架开发 - WSGI协议

目录 浏览器请求动态页面过程 多进程web服务端代码 - 面向过程 封装对象分析 增加识别动态资源请求的功能 为什么需要 WSGI协议 WSGI协议的介绍 定义WSGI接口 编写framwork支持WSGI协议&#xff0c;实现浏览器显示 hello world 本次开发的完整代码如下&#xff1a; 浏…

社区活动 | OpenVINO™ DevCon 中国系列工作坊第二期 | 使用 OpenVINO™ 加速生成式 AI...

生成式 AI 领域一直在快速发展&#xff0c;许多潜在应用随之而来&#xff0c;这些应用可以从根本上改变人机交互与协作的未来。这一最新进展的一个例子是 GPT 模型的发布&#xff0c;它具有解决复杂问题的能力&#xff0c;比如通过医学和法律考试这种类似于人类的能力。然而&am…

MySql脚本 asc 排序字段空值条目靠后的写法

场景&#xff1a; mysql中如果使用正序 asc 排序&#xff0c;那么默认是把排序字段值为空的条目数据&#xff0c;优先排到前面&#xff0c;这明显不符合需求&#xff0c;解决如下 一、重现问题 -- 按排序号-正序 select shop_id,sort_num,update_time from t_shop_trend_conte…

SpringMvc中文件上传

文章目录 1.导入文件上传所需要的jar包 2. 配置文件解析器 3.写一个前端页面 4.写后台程序 1.导入文件上传所需要的jar包 <dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.…

华为FIT痩AP旁挂式隧道组网实验(一)

拓扑图 实验设备型号ACAC6005S1S5700S2S3700APAP2050DNAP4AP2050DNAR1AR200 没有配置好之前,是没有这个AP范围圈的 配置流程 接入交换机创建VLAN,配置对应端口的链路类型,放行vlan,开启端口隔离 # 与AP连接的接口(0/0/2) [S2]vlan batch 100 101 [S2]int e0/0/2 [S2-Ethern…

finalshell使用方法,前端vue更新服务器项目

首先我们看看finalshell的整体 上面是xshell一样&#xff0c;可以输命令 上面是WinSCP一样&#xff0c;可以直接拖文件&#xff0c;下载&#xff0c;上传&#xff0c;可视化视图 1.下载服务器文件 服务器文件通过Jenkins打包上去的&#xff0c;首先我们把文件下载到本地 点击…