时间复杂度、空间复杂度实践练习(力扣OJ)
目录
文章目录
前言
题目一:轮转数组
思路一:
思路二:
思路三:
题目二:消失的数字
思路一:
思路二:
思路三:
题目三:移除元素
思路:
总结
前言
想要编写高效的算法,了解时间复杂度是至关重要的。在本文中,我们将介绍一些时间复杂度和空间复杂度的练习,通过实际例子帮助您分析程序的时间复杂度和空间复杂度 ,前边已经了解过,复杂度是评价一个程序好坏标准,今天我们切身体验一下数据结构入门刷题。如何写出好的程序。
题目一:轮转数组
题目如下:
题目给出的示例如下:
思路一:
没做过类似题目的人,大多数人思路或许是这样的:将数组最好一个元素保存,其他元素向后移动,再将保存的元素放在最前边。这也只是这道题的其中一种解题思路。但这个思路在力扣上过不去的。
我们来分析一下这个思路:我们知道数组元素个数假设为n,但要将其他元素向后移动就需要进行n-1次,此外如果遇到最坏的情况我们需要轮转n-1次(执行n次就是原数组,n+1次就等价于轮转一次),每次执行n-1次,它的时间复杂度就是O(N^2),空间复杂度为O(1)。由此可见这个思路的效率很低,所以这个思路我就不再实现。
思路二:
我们观察一下初始数组和输出数组的特点,就可以很容易的想到这个思路:轮转几次就把后几个数字移到前边,把前边的部分移到后边。这个方法简单粗暴。
代码实现:
void rotate(int* nums, int numsSize, int k)
{int *tmp = (int*)malloc( sizeof(int) * numsSize );k %= numsSize;memcpy(tmp,nums+numsSize-k,sizeof(int)*k);memcpy(tmp+k,nums,sizeof(int)*(numsSize-k));memcpy(nums,tmp,sizeof(int)*numsSize);free(tmp);
}
它的时间复杂度为O(N),空间复杂度也为O(N)。用空间来换取效率,这个思路也并不是最优解。
思路三:
我们也可以通过将数组元素逆置的方法来达到轮转的效果思路如下:
代码实现:
void reverse(int* nums, int star, int end) {while (star < end) {int temp = nums[star];nums[star] = nums[end];nums[end] = temp;star++;end--;}
}void rotate(int* nums, int numsSize, int k) {k %= numsSize;reverse(nums, 0, numsSize - 1);reverse(nums, 0, k - 1);reverse(nums, k, numsSize - 1);
}
这个思路的时间复杂度为O(N),空间复杂度为O(1)。这个思路才是这道题的最优解。
题目二:消失的数字
题目描述:
思路一:
题目中说到数组包含从0到n的所有整数,但缺少其中一个。那我们就可以先对数组的元素进行排序,然后遍历,如果下一个数据不等于下一个数加一,那么下一个数就是消失的数字。思路理清之后,我们可以先看一下这个思路的复杂度如何。
复杂度也取决于排序的方法,最优的排序是使用qsort排序,时间复杂度为O(logN*N)。然后是遍历,根据大O的渐进表示法,估算出它的时间复杂度为O(logN*N)。可见这个方法的效率并不高,我们对于复杂度高的方法就不再实现。
思路二:
数组中的数据包含0到n所有整数,但缺失某一个,那我们就可以使用这个思路,将0到n看作一个等差数列,使用等差数列求和公式求和,最后将这个值依次减去数组中元素,最后的结果就是消失的数字。根据这个思路我们可以分析出它的时间复杂度是O(N)。
代码实现:
int missingNumber(int* nums, int numsSize){int n=numsSize;int ret=n*(n+1)/2;for(int i=0;i<n;i++){ret-=nums[i];}return ret;
}
思路三:
使用异或的方法,两个相同的数字异或的结果是0,并且异或符合乘法结合律,例如:1^2^1等于2,1^1^2也等于2。根据异或的这个特性,我们可以先异或0到n的所有数字,在将数组中所有元素依次异或,最终的结果就是消失的数字,根据思路我们可以估算出这个方法的时间复杂度也是O(N)。
代码实现:
int missingNumber(int* nums, int numsSize){
int ret=0;
for(int i=0;i<numsSize;i++)
{ret^=i; ret^=nums[i];
}
return ret^numsSize;
}
异或0到n的数字与数组同时异或就会少异或最后一个数字,所有最后返回时进行异或。
题目三:移除元素
题目描述:
示例与说明:
题目要求空间复杂度是O(1),并且数组还是无序的,返回的数组还要求是原来的顺序。看对于没做过类似题目的朋友,到这道题或许会感到头大,能想到的方法也大多数都很复杂。
不要在意力扣的题目难度标签,力扣题目显示为简单的题目不一定简单,但难度标为中等或难的题目题解思路一定复杂。
思路:
这里我向大家介绍一种很简单的方法,这种思路在其他很多场景中也是很常用的。我们可以遍历这个数组,如果数组中的元素与要删除的val值不相等就插入到数组中,如果相等就往后走。
假设要删除2。
0不等于2就插入数组,继续下一个,1与2不相等插入数组,继续向后遇到2不插入,原数组继续向后走。这个思路它的时间复杂度是O(N)。至于空间复杂度,题目要求空间复杂度为O(1),但这个方法显然空间复杂度是O(N),但是我们好好想一想,我们如果不选择创建新的数组,直接在原数组例插入,这样是否也可以。答案是可行的。依据这个思路我们将代码实现。
代码如下:
int removeElement(int* nums, int numsSize, int val) {int sz = numsSize;int pos=0;for (int i = 0; i < numsSize; i++){if (val != nums[i])nums[pos++]=nums[i];elsesz--;}return sz;
}
方法简单快捷。
总结
时间复杂度和空间复杂度有是衡量算法效率和算法好坏的重要指标,它直接关系到算法的执行速度和资源消耗。在本篇博客中,我们将通过了一系列时间复杂度和空间复杂度实战应用的练习,可以帮助您提升对算法效率的理解和应用能力,好的,到这里就要结束了,最后,感谢阅读!
相关文章:

时间复杂度、空间复杂度实践练习(力扣OJ)
目录 文章目录 前言 题目一:轮转数组 思路一: 思路二: 思路三: 题目二:消失的数字 思路一: 思路二: 思路三: 题目三:移除元素 思路: 总结 前言 想要编写高效的…...

JMeter(二十四)、使用吞吐量控制器实现不同的用户操纵不同的业务
一、需求 需求:博客系统,模拟用户真实行为,80%的用户阅读文章,20%的用户创建文章,创建文章的用户随机的删除或者修改文章。 二、脚本实现 80%的用户查看文章 20%用户创建文章 根据post_id是否能整除2,决…...
8.1Jmeter5.1:Jmeter SSL
Jmeter配置证书请求双向认证SSL的web接口 需求:需要通过Jmeter配置证书请求双向认证SSL的web接口 提供的证书:P12格式 备注:Jmeter需要导入的证书是keystore证书 那么要先把P12转成keystore文件 1、使用p12生成keystore文件 keytool介绍 这里需要提到提到jdk自带的key…...
7-7 找最小的字符串 (15 分)
7-7 找最小的字符串 (15 分) 本题要求编写程序,针对输入的N个字符串,输出其中最小的字符串。 输入格式: 输入第一行给出正整数N;随后N行,每行给出一个长度小于80的非空字符串,其中不会出现换行…...

Red Hat 安装MySQL 8.0与 Navicat
目录 Red Hat 安装 MySQL 8.0 1、更新软件包列表 2、安装MySQL服务器和客户端 3、启动MySQL服务 4、确保MySQL服务器正在运行 5、root 用户的密码 6、登录MySQL,输入mysql密码 7、MySQL默认位置 Red Hat 安装 Navicat 1、下载 Navicat 2、执行命令 Red H…...
17游刃有余:动手实现自己的RPC框架(三)
这篇文章我们来实现跨语言的网络通信。 跨语言RPC框架的必要性主要体现在以下几个方面: 解决不同语言之间的互操作性。不同语言使用的数据类型和序列化方式可能不同,跨语言 RPC 框架可以提供通用的编解码库和语言适配器,以便将不同语言的数据转换为通用的格式进行通信。实现…...

c语言——求n之内的素数和
//求n之内的素数和 //列如:2、3、5等 #include<stdio.h> #include<math.h> int main() {int i,j,k,n0;scanf("%d",&n);for(i2;i<n;i){k(int)sqrt(i);for(j2;j<k;j)if(i%j0)break;if(j>k){printf("%d,",i);n;if(n%50)p…...

【M波段2D双树(希尔伯特)小波多分量图像去噪】基于定向M波段双树(希尔伯特)小波对多分量/彩色图像进行降噪研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

unity TextMeshPro 富文本
<b>粗体标签</b> <i>斜体标签</i> <u>下划线标签</u> <s>删除线标签</s> <sup>上标标签</sup>前面后边上标签 5<sup>。</sup>C <sub>下标标签,如:</sub>H<sub&…...
【PyTorch】PyTorch、Cuda 的安装和使用
原文作者:我辈李想 版权声明:文章原创,转载时请务必加上原文超链接、作者信息和本声明。 文章目录 前言一、Anaconda 中安装 PyTorch 和 CUDA二、检查PyTorch和CUDA版本三、PyTorch的基本使用四、PyTorch调用cuda五、Matplotlib绘制Pytorch损…...

1.初识typescript
在很多地方的示例代码中使用的都是ts而不是js,为了使用那些示例,学习ts还是有必要的 JS有的TS都有,JS与TS的关系很像css与less ts在运行前需要先编译为js,浏览器不能直接运行ts 目录 1 编译TS的工具包 1.1 安装 1.2 基本…...

iPhone 6透明屏是什么?原理、特点、优势
iPhone 6透明屏是一种特殊的屏幕技术,它能够使手机屏幕变得透明,让用户能够透过屏幕看到手机背后的物体。 这种技术在科幻电影中经常出现,给人一种未来科技的感觉。下面将介绍iPhone 6透明屏的原理、特点以及可能的应用。 iPhone 6透明屏的原…...

prometheus+grafana进行服务器资源监控
在性能测试中,服务器资源是值得关注一项内容,目前,市面上已经有很多的服务器资 源监控方法和各种不同的监控工具,方便在各个项目中使用。 但是,在性能测试中,究竟哪些指标值得被关注呢? 监控有…...

EventBus 开源库学习(三)
源码细节阅读 上一节根据EventBus的使用流程把实现源码大体梳理了一遍,因为精力有限,所以看源码都是根据实现过程把基本流程看下,中间实现细节先忽略,否则越看越深不容易把握大体思路,这节把一些细节的部分再看看。 …...
zjzcyList.stream().map(Pb_zjzcy::getZjid).collect(Collectors.toList()); 解释一下
zjzcyList.stream().map(Pb_zjzcy::getZjid).collect(Collectors.toList()); 解释一下 这段代码是使用Java 8的流式处理(Stream)对一个存储了对象的列表(zjzcyList)进行操作,并最终返回一个包含了列表中每个对象的Zji…...

车载总线系列——J1939 二
车载总线系列——J1939 二 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站…...

【C#学习笔记】引用类型(2)
文章目录 ObjectEqualsGetTypeToStringGetHashCode string逐字文本复合格式字符串字符串内插 StringBuilderStringBuilder 的工作原理StringBuilder提供的方法访问字符迭代字符查询字符 dynamic Object 支持 .NET 类层次结构中的所有类,并为派生类提供低级别服务。…...
【Rust 基础篇】Rust类函数宏:代码生成的魔法
导言 Rust是一门现代的、安全的系统级编程语言,它提供了丰富的元编程特性,其中类函数宏(Function-Like Macros)是其中之一。类函数宏允许开发者创建类似函数调用的宏,并在编译期间对代码进行生成和转换。在本篇博客中…...

Spring-1-透彻理解Spring XML的Bean创建--IOC
学习目标 上一篇文章我们介绍了什么是Spring,以及Spring的一些核心概念,并且快速快发一个Spring项目,实现IOC和DI,今天具体来讲解IOC 能够说出IOC的基础配置和Bean作用域 了解Bean的生命周期 能够说出Bean的实例化方式 一、Bean的基础配置 …...

【JAVA】类和对象
作者主页:paper jie的博客 本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文录入于《JAVASE语法系列》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...