[100天算法】-最长递增子序列的个数(day 47)

news/2025/3/21 3:13:49/

题目描述

给定一个未排序的整数数组,找到最长递增子序列的个数。示例 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位有符号整数。来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-longest-increasing-subsequence
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

方法 1:动态规划

思路

代码

JavaScript Code

/*** @param {number[]} nums* @return {number}*/
var findNumberOfLIS = function (nums) {const n = nums.length;const length = Array.from({ length: n }).fill(1);const count = Array.from({ length: n }).fill(1);for (let i = 0; i < n; i++) {for (let j = 0; j < i; j++) {if (nums[j] >= nums[i]) continue;if (length[j] + 1 > length[i]) {length[i] = length[j] + 1;count[i] = count[j];} else if (length[j] + 1 == length[i]) {count[i] += count[j];}}}const longest = Math.max(...length);return length.reduce((cnt, len, i) => (len == longest ? cnt + count[i] : cnt),0);
};

C++ Code

class Solution {
public:int findNumberOfLIS(vector<int>& nums) {int n = nums.size();vector<int> length(n, 1);vector<int> count(n, 1);for (int i = 0; i < n; i++) {for (int j = 0; j < i; j++) {if (nums[i] <= nums[j]) continue;if (length[j] + 1 > length[i]) {length[i] = length[j] + 1;count[i] = count[j];}else if (length[j] + 1 == length[i]) {count[i] += count[j];}}}int longest = *max_element(length.begin(), length.end());int ans = 0;for (int i = 0; i < n; i++) {if (length[i] == longest) {ans += count[i];}}return ans;}
};

复杂度分析

  • 时间复杂度:$O(N^2)$。N 是数组 nums 的长度。
  • 空间复杂度:$O(N)$。N 是辅助数组 length 和 count 的长度。

http://www.ppmy.cn/news/1187003.html

相关文章

[100天算法】-二叉树剪枝(day 48)

题目描述 给定二叉树根结点 root &#xff0c;此外树的每个结点的值要么是 0&#xff0c;要么是 1。返回移除了所有不包含 1 的子树的原二叉树。( 节点 X 的子树为 X 本身&#xff0c;以及所有 X 的后代。)示例1: 输入: [1,null,0,0,1] 输出: [1,null,0,null,1]示例2: 输入: […

小程序开发——小程序项目的配置与生命周期

1.app.json配置属性 app.json配置属性 2.页面配置 app的页面配置指的是pages属性&#xff0c; pages数组的第一个页面将默认作为小程序的启动页。利用开发工具新建页面时&#xff0c;则pages属性对应的数组将自动添加该页面的路径&#xff0c;若是在硬盘中添加文件的形式则不…

浅谈js代码的封装方法(2023.10.30)

常见的js代码封装方法 2023.10.30 需求1、js代码封装的优缺点2、js代码封装方式2.1 方式一&#xff1a;function function declarations2.1.1 示例 2.2 方式二&#xff1a;class2.2.1 class declarations2.2.2 Class expressions 2.3 变量函数2.4 变量闭包匿名函数2.5 闭包函数…

你被骗了吗?别拿低价诱骗机器视觉小白,4000元机器视觉系统怎么来的?机器视觉工程师自己组装一个2000元不到,还带深度学习

淘宝闲鱼&#xff0c;大家搜搜铺价格&#xff0c;特别是机器视觉小白。 机架&#xff1a;&#xff08;新的&#xff09;200元以下。(看需求&#xff0c;自己简单打光&#xff0c;买个50元的。如果复杂&#xff0c;就拿给供应商免费打光) 相机&#xff0c;镜头&#xff1a;&am…

计算机网络与技术——数据链路层

&#x1f60a;计算机网络与技术——数据链路层 &#x1f680;前言☃️基本概念&#x1f94f;封装成帧&#x1f94f;透明传输&#x1f94f;差错检测 ☃️点对点协议PPP&#x1f94f;PPP协议的特点&#x1f94f;PPP协议的帧格式&#x1f50d;PPP异步传输时透明传输&#xff08;字…

软考高项-十大知识领域,49活动

知识领域数量项目管理过程组启动规划执行监控收尾项目整体管理7制订项目章程制订项目管理计划管理与指导项目工作 管理项目知识 监控项目管理工作 实施整体变更控制 结束项目或阶段项目范围管理6规划范围管理 收集需求 定义范围 创建WBS 确认范围 控制范围 项目进度管理6<

【Vue原理解析】之响应式系统

引言 Vue2的响应式系统是核心之一&#xff0c;它使得Vue.js能够实现数据驱动的视图变化。其实现主要基于Object.defineProperty API&#xff0c;通过在数据对象上添加属性监听来实现数据变化时对视图进行更新。 vue3实现主要基于Proxy API和Reactive&#xff0c;Reactive函数…

小红书平台用户数据分析与可视化

管理器、网页下载器、网页解析器、输出管理器这四个模块去搭建一个爬虫框架&#xff0c;将爬虫流程统一化&#xff0c;将通用的功能进行抽象&#xff0c;减少重复工作。要求实现的爬虫框架可以进行分布式爬取&#xff0c;解决爬虫的统一调度和统一去重&#xff0c;以及存储问题…