时间复杂度、空间复杂度实践练习(力扣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语法系列》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
