【动态规划-最长递增子序列(LIS)】力扣673.最长递增子序列的个数

news2024/10/9 4:53:42

给定一个未排序的整数数组 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。
在这里插入图片描述

动态规划

class Solution {
public:
    int findNumberOfLIS(vector<int>& nums) {
        int n = nums.size();
        int maxLen = 0, ans = 0;
        vector<int> dp(n, 1), count(n, 1);
        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] > maxLen){
                maxLen = dp[i];
                ans = count[i];
            }
            else if(dp[i] == maxLen){
                ans += count[i];
            }
        }


        return ans;
    }
};

在这里插入图片描述

我们在求最长递增子序列的模板题(力扣300)的时候维护了一个数组dp[i]来记录结尾为nums[i]的最长公共递增子序列长度。在这道题目中,我们新增维护一个数组count[i]来记录结尾为i的最长公共子序列的长度。

那么要如何维护count呢?我们在循环中,一旦发现if(dp[j] + 1 > dp[i]),就说明发现了更长的公共子序列,那么这个时候,我们就重置count[i]为count[j],之所以重置为count[j]是因为count[j]代表着之前以nums[j]结尾的最长公共递增子序列的个数,那么有count[j]个最长公共递增子序列再加上当前的nums[i],就有count[j]种以nums[i]结尾的最长公共递增子序列。

然后再继续遍历以nums[i]结尾的最长公共递增子序列,如果发现了有相同长度的公共递增子序列,就加上这个以nums[j]结尾的最长公共子序列的数量count[j]。

在每次第一层循环结束时,以nums[i]结尾的最长公共递增子序列数量已经确定。由于我们要找的是所有循环过后的全局最长公共递增子序列数量,所以我们定义一个maxLen来储存最长的公共递增子序列长度,也定义一个整型ans来记录最长递增子序列的数量。

这道题目可以通过类似力扣300的方式使用前缀和以及二分查找的方式进行优化时间复杂度为nlogn。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于SpringBoot在线拍卖系统【附源码】

基于SpringBoot在线拍卖系统 效果如下&#xff1a; 网站首页界面 用户登录界面 竞拍商品界面 管理员登录界面 管理员功能界图 竞拍商品界面 系统界面 订单界面 研究背景 随着社会的发展&#xff0c;信息化时代带来了各行各业的变革。电子商务已成为人们日常生活不可或缺的一…

ES(Elasticsearch)SSL集群部署

8.x后ES不在需要自行准备JDK环境&#xff0c;部署的服务包含ES、Kibana、Logstash&#xff0c;使用二进制方式部署&#xff0c;为了提高安全性&#xff0c;加密logstash、kibana及其他客户端到ES间的通信。 1、准备工作 1.1、 es无法使用root用户启动 useradd -m -s /bin/bas…

搭建安全的分析环境

分析恶意软件&#xff0c;动态行为分析是必不可少的一步&#xff0c;所有样本都必须在虚拟环境中执行&#xff0c;不可在主机上执行。因此&#xff0c;我们要需要搭建供动态分析的环境以及防止在主机运行的环境。 动态分析环境搭建 工具 虚拟机 虚拟机软件有很多&#xff0…

前端面试:项目细节重难点问题分享(17)

更多详情&#xff1a;爱米的前端小笔记&#xff08;csdn~xitujuejin~zhiHu~Baidu~小红shu&#xff09;同步更新&#xff0c;等你来看&#xff01;都是利用下班时间整理的&#xff0c;整理不易&#xff0c;大家多多&#x1f44d;&#x1f49b;➕&#x1f914;哦&#xff01;你们…

案例分享—国外ui设计优秀案例

国外企业更注重用户体验设计&#xff0c;倾向于简洁清晰的设计风格&#xff0c;以提高用户的使用体验和操作效率。他们注重“简约至上”的设计理念&#xff0c;认为简洁的设计可以减少用户的认知负担&#xff0c;提高用户的工作效率。 设计师在界面设计中往往更加注重创意性和个…

Stable Diffusion绘画 | IP角色多视图生成技巧

在游戏设计、小说推文、角色设计里面&#xff0c;很多场景都运用到IP角色的多视图。 人物角色多视图 第1步&#xff0c;输入提示词&#xff1a; 第2步&#xff0c;由于要在同一张图片中生成多角度的并排展示&#xff0c;需要修改图片的分辨率&#xff08;尤其是宽度&#xff…

Vue 3 + TypeScript + Vite + Echarts

Vue 3 TypeScript Vite Echarts 1、创建工程 npm create vitelatestcd echarts npm install npm run dev2、安装项目依赖模块 npm install types/node --save-devnpm install vue-router4npm install animate.css --save npm install gsap --savenpm install fetch --save…

LayaAir3.2正式版来了:支持鸿蒙Next系统、程序蓝图(可视化编程)等重要的功能模块...

LayaAir3.2-beta.1的版本中&#xff0c;我们已介绍了3.2是真正的全平台发布版本《LayaAir3.2来了&#xff1a;性能大幅提升、一键发布安装包、支持WebGPU、3D导航寻路、升级为真正的全平台引擎》。 在其后的beta版本迭代中&#xff0c;我们不仅及时修复了开发者们反馈的BUG&…

知识改变命运 数据结构【java对象的比较】

0&#xff1a;前言 在基本数据类型中&#xff0c;我们可以直接使用号比较是否相等&#xff0c;还记的学堆哪里时候&#xff0c;插入一个数据&#xff0c;就会与其他数据进行比较&#xff0c;当时我们传入的是Integer类型&#xff0c;在Integer类里面已经实现了compare。 如果…

Ubuntu22.04 获取docker 镜像失败如何处理

最近在使用docker 获取镜像发现 如下错误 无法正常的访问 如果能正常上网的情况下&#xff0c;可以尝试如下操作 首先进入/etc/docker/daemon.json文件 然后在里面加入下面的配置 { "registry-mirrors": ["https://docker.registry.cyou", "htt…

探索杨辉三角形的奥秘:C#实现

文章目录 杨辉三角形简介特点 C#实现杨辉三角形环境准备代码实现代码解释1. 用户输入2. 输入验证3. 初始化第一行4. 生成杨辉三角形5. 打印杨辉三角形 结论 杨辉三角形&#xff0c;也被称为帕斯卡三角形&#xff0c;是一个历史悠久且充满数学魅力的数字模式。它不仅在数学领域有…

论文速读:基于概率教师学习的域自适应目标检测

原文标题&#xff1a;Learning Domain Adaptive Object Detection with Probabilistic Teacher 中文标题&#xff1a;基于概率教师学习的域自适应目标检测 代码地址&#xff1a; GitHub - hikvision-research/ProbabilisticTeacher: An official implementation of ICML 2022 p…

【计算机毕设】springboot-家具销售电商平台(附源码)

摘 要 Abstracts 目 录 第1章 绪论 1.1课题背景 1.2研究意义 1.3研究内容 第2章 技术介绍 2 2.1相关技术 3 2.2 Java技术 3 2.3 MySQL数据库 4 2.4 Tomcat介绍 4 2.5 Spring Boot框架 5 第3章 需求分析 5 3.1需求分析概述 6 3.2可行性分析 6 3.2.1经济可行性 6 3.2.2技…

Docker:快速部署

docker安装&#xff1a; ​‌​‬&#xfeff;​&#xfeff;⁠​‍‬​‍‬‬‌​‬‬‬​&#xfeff;⁠​‍​​‌‬‌&#xfeff;​​​​​​‌​​​​⁠​‍⁠‌安装Docker - 飞书云文档 (feishu.cn) docker命令解读 docker run -d \ > --name mysql \ > -p 33…

OpenHarmony(鸿蒙南向开发)——轻量系统内核(LiteOS-M)【异常调测】

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 基本概念 OpenHarmony LiteOS-M提供异常接管调测手段&#xff0c;…

【基础算法总结】字符串篇

目录 一&#xff0c;算法简介二&#xff0c;算法原理和代码实现14.最长公共前缀5.最长回文子串67.二进制求和43.字符串相乘 三&#xff0c;算法总结 一&#xff0c;算法简介 字符串 string 是一种数据结构&#xff0c;它一般和其他的算法结合在一起操作&#xff0c;比如和模拟&…

守护数据安全:.rmallox勒索病毒的防范与应对策略

导言 在当今这个数字化时代&#xff0c;网络空间已成为人们生活、工作和娱乐不可或缺的一部分。然而&#xff0c;随着互联网的普及和技术的飞速发展&#xff0c;网络安全问题也日益凸显&#xff0c;成为了一个全球性的挑战。其中&#xff0c;.rmallox勒索病毒作为一种恶意软件…

【linux】进程间的通信(一)

1. 了解进程通信 两个或者多个进程实现数据层面的交互 因为进程独立性的存在&#xff0c;导致进程通信成本较高&#xff08;通信需要成本&#xff09; 2. 进程间通信目的 进程间通信的本质是&#xff0c;让不同的进程看到同一份"资源"&#xff08;即同一份内存空…

基础算法之前缀和--Java实现(下)--LeetCode题解:-和为 K 的子数组 - 和可被 K 整除的子数组 -连续数组-矩阵区域和

这里是Themberfue 和为 K 的子数组 题目解析 返回子数组中所有元素的和等于给定k的个数。 算法讲解 这题好像是用滑动窗口解决&#xff0c;但其实不能&#xff0c;因为 nums 中的元素可能存在负数&#xff0c;就不能保证其单调性的性质。 用前缀和求也不易想到&#xff0c;…

Java编码方式:Base64编码与解码

1、Base64 算法介绍 Base64 是一种基于 64 个可打印字符来表示二进制数据的表示方法。它主要用于在不支持二进制数据的场合&#xff08;如电子邮件、URL、文件系统名等&#xff09;传输二进制数据。严格来说 Base64 并不是一种加密/解密算法&#xff0c;而是一种编码方式。Bas…