c++中的最长递增子序列(Longest Increasing Subsequence)(算法章完结)

前言

hello大家好啊,我是文宇。

今天是最后一篇算法(暂时性的,以后可能还有)

最长递增子序列(Longest Increasing Subsequence)

最长递增子序列(Longest Increasing Subsequence,简称LIS)是一个常见的算法问题,在计算机科学中具有重要的应用。LIS问题可以描述为:给定一个序列,找出其中最长的递增子序列。

在C++中,可以使用多种方法来解决LIS问题。下面将详细介绍两种常见的解法。

  1. 动态规划(Dynamic Programming)解法:

动态规划是一种常见的求解最优化问题的方法,该方法通常包含以下三个要素:最优子结构、重叠子问题和状态转移方程。

对于LIS问题,可以定义一个一维数组dp,其中dp[i]表示以第i个元素结尾的最长递增子序列的长度。初始时,将dp数组的所有元素初始化为1,表示每个单独的元素本身就是一个递增子序列。

然后,从第一个元素开始遍历,依次计算以当前元素结尾的最长递增子序列的长度。对于第i个元素,需要遍历该元素之前的所有元素j(0 <= j < i),如果当前元素大于前面的元素并且以第j个元素结尾的最长递增子序列的长度加1大于以第i个元素结尾的最长递增子序列的长度,则更新dp[i]。

最后,遍历dp数组,找出其中的最大值,即为最长递增子序列的长度。

下面是C++代码实现:

int lengthOfLIS(vector<int>& nums) {int n = nums.size();if (n == 0) return 0;vector<int> dp(n, 1);int maxLen = 1;for (int i = 1; i < n; i++) {for (int j = 0; j < i; j++) {if (nums[i] > nums[j] && dp[j] + 1 > dp[i]) {dp[i] = dp[j] + 1;}}maxLen = max(maxLen, dp[i]);}return maxLen;
}

  1. 二分查找(Binary Search)解法:

二分查找是一种常见的查找算法,它可以用来解决LIS问题。该方法的思路是维护一个递增的序列,遍历原始序列中的每个元素,将其插入到递增序列中的合适位置。

具体实现如下:

首先,定义一个数组tail,用于存储递增序列的元素。初始化时,将tail数组的第一个元素设置为原始序列的第一个元素。

然后,从原始序列的第二个元素开始遍历,对于每个元素,使用二分查找找到它在递增序列中的插入位置。如果找到了合适的位置,将该元素插入到对应的位置;否则,将它替换掉递增序列中比它大的第一个元素。

最后,返回递增序列的长度即可。

下面是C++代码实现:

int lengthOfLIS(vector<int>& nums) {int n = nums.size();if (n == 0) return 0;vector<int> tail;tail.push_back(nums[0]);for (int i = 1; i < n; i++) {if (nums[i] > tail.back()) {tail.push_back(nums[i]);} else {int left = 0, right = tail.size() - 1;while (left < right) {int mid = left + (right - left) / 2;if (tail[mid] >= nums[i]) {right = mid;} else {left = mid + 1;}}tail[left] = nums[i];}}return tail.size();
}

这两种方法都能够有效地解决LIS问题,它们的时间复杂度都为O(n^2),其中n为原始序列的长度。但是二分查找解法的时间复杂度可以通过使用辅助数组进行优化,将其降低到O(nlogn)。

以上是关于C++中最长递增子序列问题的详细解释和实现,希望能对你有所帮助。

结语

算法章完结。预告:下周会出 《一周速通c++(顺序,选择,循环篇)》。后面还有函数,数组,字符串等。

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

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

相关文章

【Golang 面试基础题】每日 5 题(十)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…

【机器学习】解开反向传播算法的奥秘

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 解开反向传播算法的奥秘反向传播算法的概述反向传播算法的数学推导1. 前向传播2…

Linux进程——程序地址空间详解

文章目录 程序地址空间地址空间与物理内存什么是程序地址空间管理程序地址空间虚拟地址与物理地址的映射页表的结构及其作用程序地址空间的作用 程序地址空间 我们之前学习内存的时候&#xff0c;有说内存的分布大概是这样的 其中堆由下而上&#xff0c;栈由上而下 除此之外&…

JavaScript青少年简明教程:函数及其相关知识(下)

JavaScript青少年简明教程&#xff1a;函数及其相关知识&#xff08;下&#xff09; 继续上一节介绍函数相关知识。 箭头函数&#xff08;Arrow Function&#xff09; 箭头函数是 ES6&#xff08;ECMAScript 2015&#xff09;及更高版本中引入的语法&#xff0c;用于简化函数…

LeetCode:删除排序链表中的重复元素(C语言)

1、问题概述&#xff1a;给定一个已排序链表的头&#xff0c;删除重复元素&#xff0c;返回已排序的链表 2、示例 示例 1&#xff1a; 输入&#xff1a;head [1,1,2] 输出&#xff1a;[1,2] 示例 2&#xff1a; 输入&#xff1a;head [1,1,2,3,3] 输出&#xff1a;[1,2,3] 3…

深度解析Memcached:内存分配算法的优化之旅

&#x1f525; 深度解析Memcached&#xff1a;内存分配算法的优化之旅 Memcached是一个高性能的分布式内存缓存系统&#xff0c;广泛用于提高Web应用程序的性能。它通过减少数据库查询次数来加速数据检索。然而&#xff0c;Memcached的性能在很大程度上取决于其内存分配算法的…

前端三方库零碎(持续更新)

本文主要记录开发实践过程中遇到的前端库&#xff0c;做个记录总结&#xff0c;以备不时之需 easyui-datagrid EasyUI 是一个基于 jQuery 的用户界面插件库&#xff0c;提供了丰富的用户界面组件和工具&#xff0c;其中包括 datagrid&#xff08;数据表格&#xff09;组件。E…

2024年国际高校数学建模大赛(IMMCHE)问题A:金字塔石的运输成品文章分享(仅供学习)

2024 International Mathematics Molding Contest for Higher Education Problem A: Transportation of Pyramid Stones&#xff08;2024年国际高校数学建模大赛&#xff08;IMMCHE&#xff09;问题A&#xff1a;金字塔石的运输&#xff09; 古埃及金字塔石材运输优化模型研究…

spring(一)

一、spring特点 1.非侵入式&#xff1a;使用 Spring Framework 开发应用程序时&#xff0c;Spring 对应用程序本身的结构影响非常小。对领域模型可以做到零污染&#xff1b;对功能性组件也只需要使用几个简单的注解进行标记&#xff0c;完全不会破坏原有结构&#xff0c;反而能…

2024最新Selenium面试题(附带答案),建议收藏备用

一.你在TestNG中使用了哪些注解&#xff1f; TestBeforeSuiteAfterSuiteBeforeTestAfterTestBeforeClassAfterClassBeforeMethodAfterMethod 二.如何从Excel中读取数据&#xff1f; FileInputStream fs new FileInputStream(“excel文件路径”); Workbook wb WorkbookFact…

探索智慧校园资产入库功能,构建高效校园资产管理体系

在智慧校园的资产管理框架下&#xff0c;资产入库功能作为资产生命周期管理的开端&#xff0c;扮演着至关重要的角色。这一功能确保了新购置或转入的资产能够迅速而准确地被记录在系统中&#xff0c;从而无缝融入日常的管理流程。当资产入库时&#xff0c;系统要求详细登记一系…

2024最新前端学习路线指南!

2024最新前端学习路线指南&#xff01; 如果你正在寻找一份全面的前端学习路线图&#xff0c;那么这份精心打造的学习大纲恰好符合您的需求。无论您是新手还是经验丰富的开发者&#xff0c;这份路线图都能够帮助您系统地掌握前端开发的关键知识点&#xff0c;并在实践中不断提…

git连接远程仓库

一、本地新建代码,上传到远程仓库 1.git init #初始化本地仓库 2.git remote -v #查看当前仓库的远程地址 3.git remote add origin 远程仓库的URL 4.git branch master / git branch dev 创建 主分支或者 dev 分支 5.git checkout master/dev. 切换到主分支或者dev 分支…

Mysql-生产环境实战经验总结

文章目录 真实生产环境下的Mysql数据库机器配置如何规划互联网公司的生产环境数据库是如何进行性能压测1. 准备测试环境2. 构建测试场景3. 性能测试4. 监控与分析5. 资源压力测试6. 故障恢复测试7. 文档记录与复盘8. 安全与合规注意事项 如何为生产环境中的数据库部署监控系统1…

<PLC><HMI><汇川>在汇川HMI画面中,如何为UI设置全局样式?

前言 汇川的HMI软件是使用了Qt来编写的,因此在汇川的HMI程序编写过程,是支持使用qt的样式来自定义部件样式的,即qss格式。 概述 汇川的软件本身提供三个系统的style样式,我们可以直接使用,但是,如果系统提供的样式不符合你的需求,那么你可以对其进行修改,或者自己新建…

修改linux服务器上的mariadb/mysql数据库的密码

文章目录 一、查看数据库的状态二、修改密码 可能我们在最初安装数据库时没有设置密码或者已经设置了但是又想修改另一个密码&#xff0c;可以这样操作来修改我们的密码。 以数据库 mariadb 为例。 一、查看数据库的状态 使用命令 systemctl is-active mariadb 查看当前数据库…

Github 2024-07-27开源项目日报 Top10

根据Github Trendings的统计,今日(2024-07-27统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量非开发语言项目2C++项目2C项目2TypeScript项目1JavaScript项目1Java项目1Python项目1C#项目1免费编程学习平台:freeCodeCamp.org 创建周期:33…

JMeter接口测试:测试中奖概率!

介绍 Apache JMeter 是 Apache 组织基于 Java 开发的压力测试工具&#xff0c;用于对软件做压力测试。JMeter 最初被设计用于 Web 应用测试&#xff0c;但后来扩展到了其他测试领域&#xff0c;可用于测试静态和动态资源&#xff0c;如静态文件、Java 小服务程序、CGI 脚本、J…

如何开发无障碍的前端Web 网页

Web 无障碍设计&#xff08;Accessibility in Web design&#xff0c;也叫网站可及性 &#xff09;是要让所创建的网站对所有用户都可用/可访问&#xff0c;不管用户的生理/身体能力如何、不管用户是以何种方式访问网站。 让网页完全支持无障碍功能有一定成本&#xff0c;我们…

Redis 缓存

安装 安装 Redis 下载&#xff1a; Releases tporadowski/redis (github.com) winr ----services.msc-----将redis 设置为手动(只是学习&#xff0c;如果经常用可以设置为自动) 安装 redis-py 库 pip install redis-py Redis 和 StrictRedis redis-py 提供 Redis 和 Str…