轮转数组(超详细!)

前言:

  小编在上一篇文章的时候拿过轮转数组作为例子来讲述复杂度,但是小编并没有给出这个题目的正确解答,既然读者朋友已经了解复杂度了(不了解也没关系,可以看小编上一篇·文章),下面,跟随小编的脚步开始进入此习题的讲解!

目录:

1.轮转数组的解法一

2.轮转数组的解法二 

3.两种解法对应的完整代码

正文:

1.轮转数组的解法一

  首先,小编先放上这个题的大概内容,防止一些读者朋友知不道这个题目是什么:

   首先,我们知道如果时间复杂度是0(N ^ 2)的话,这个代码是通不过的,下面先来展示一下错误案例:

void rotate(int* nums, int numsSize, int k) {
    int i = 0,end = 0;
    while(k--)
    {
        end = nums[numsSize - 1];
        for(i = numsSize - 1 ; i > 0 ; i--)
        {
            nums[i] = nums[i - 1];
        }
        nums[0] = end;    //三天没敲代码了差点没忘干净
    }
}

  上面代码小编在之前写过,上面就是时间复杂度是0(N ^ 2),所以没有通过,下面我们可以通过减少循环次数来对于这个代码进行修改(就比如我们不要进行循环的嵌套),此时小编先来讲述一下第一种解法,我们可以通过开辟一个新的数组来进行这个代码的书写,下面就是小编的大致思路:

  首先,我们可以用malloc函数来创建一个新数组,下面是代码的呈现:

int* arr = (int*)malloc(numsSize * sizeof(int));  //开辟空间,创立一个数组

  在我们开辟完新数组以后,很多读者朋友会有疑问,我们为什么要创立新的数组呢?其实,我们开辟这个新数组的作用,是把它当作中间商的,它是来存放我们数组进行轮换之后的数的,之后我们可以把轮转完后的新数组的内容在给予我们本来的数组,这样我们就可以减少时间复杂度了!下面我们先来说一下如何进行轮转操作:

  首先,我们还是画一下轮转数的原理图,方便大家去理解:

  上面便是轮转数组的原理, 下面我们应该思考下,我们如何将旧数组的内容通过一种怎样的方式来传给新数组呢?这里小编将要给大家一个比较nb的算法了,这个算法真的,你看一眼就会觉的这个算法很妙,下面我们先给上代码:

	for (int i = 0; i < numsSize; i++)
	{
		arr[(i + k) % numsSize] = nums[i];
	}

  很多读者朋友可能会很奇怪,为什么arr[]里面是这个内容,下面小编通过图文的方式进行解释 :

  通过这个图文解释,我们可以看到进行这个算法的加持下,这个代码完美的实现了轮转操作 ,这里便展现了这个算法的nb之处,说实在的,小编第一次看到这个代码,就觉得这个代码很强大,能够写出这个代码的人,算法的能力肯定是很高的,我们将数组轮转以后的结果放到新数组以后,下面我们就可以进行循环赋值操作了,代码如下:

	for (int i = 0; i < numsSize; i++)
	{
		nums[i] = arr[i];
	}

  我们经过时间复杂度的计算以后,可以算出来这个代码的时间复杂度和空间复杂度都是0(N),此时这个代码经过运行是可以通过的,这个就是解法一,下面小编开始讲述解法二!

2.轮转数组的解法二

  对于轮转数组,第二种解法思路就是通过空间复杂度来代替时间复杂度的思想来进行撰写,此时这个代码主要看空间复杂度从而忽略时间复杂度,这里小编先透露一下,此时的空间复杂度是O(1) ,下面小编将会解释这个代码如何进行撰写!

  在讲述解法二之前,小编先考一下各位读者朋友,我们是否可以通过逆置的方法来对数组进行轮转?答案是肯定的,下面小编先来通过例子的方式,来给各位读者朋友来解释一下,我们如何通过逆置来进行轮转操作的。

  首先,我们可以先将数组前n - k 个数进行逆置,下面我们通过前面的特例进行图文解释:

  之后,我们再将后面k个元素进行逆置,下面是图文解释: 

  最后,我们将所有元素进行逆置操作:

  这里我们会发现,这里我们成功的将数组进行轮转了,所以我们进行三步逆置操作可以进行轮转操作!所以依靠这个思想,我们可以展开对于解法二的书写:

  首先,我们需要创建一个函数,这个函数可以进行逆置操作,此时函数内部应该放置三个变量,一个是数组名,一个表示开头,一个表示结尾,至于为什么这么设置,且听我娓娓道来:

  首先,我们想要进行逆置操作的话,首先是要确定开头和末尾的数字的,之后我们可以通过设置中间量的方式,把开头和结尾两个数进行交换,之后开头++,结尾--,从而可以完成轮转操作,这里我们需要用到循环的知识,下面是代码的书写:

void jiaohuan(int * arr,int left,int right)
{
    while(left < right)
    {
        int tmp;
        tmp = arr[left];
        arr[left] = arr[right];
        arr[right] = tmp;
        left++;
        right--;
    }

}

  之后我们在进行函数调用操作即可完成这个代码:

void rotate(int* nums, int numsSize, int k) {
    k = k % numsSize;
    jiaohuan(nums,0,numsSize - k - 1);
    jiaohuan(nums,numsSize - k,numsSize - 1);
    jiaohuan(nums,0,numsSize - 1);

}

  以上便是解法二如何进行书写,此时我们巧用空间复杂度来代替时间复杂度,从而做到了这个代码的复杂度减小,可能很多读者朋友只想看到完整的代码,下面小编将要展示这个题目完整代码:

3.两种解法对应的完整代码

解法一:

void rotate(int* nums, int numsSize, int k) {
	int* arr = (int*)malloc(numsSize * sizeof(int));  //开辟空间,创立一个数组
	assert(arr);
	for (int i = 0; i < numsSize; i++)
	{
		arr[(i + k) % numsSize] = nums[i];
	}
	for (int i = 0; i < numsSize; i++)
	{
		nums[i] = arr[i];
	}
}

解法二:

void jiaohuan(int * arr,int left,int right)
{
    while(left < right)
    {
        int tmp;
        tmp = arr[left];
        arr[left] = arr[right];
        arr[right] = tmp;
        left++;
        right--;
    }

}

void rotate(int* nums, int numsSize, int k) {
    k = k % numsSize;
    jiaohuan(nums,0,numsSize - k - 1);
    jiaohuan(nums,numsSize - k,numsSize - 1);
    jiaohuan(nums,0,numsSize - 1);

}

总结:

  以上便是轮转数组的相关内容,这里不得不感慨算法的多样性,一个题目就可以撰写出好几个代码,各位读者朋友一定要好好的去理解,如果文章有错误,恳请在评论区指出,我们在下一篇文章见喽! 

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】深入理解哈希及其底层数据结构

目录 一、unordered系列关联式容器 二、底层结构 2.1 哈希的概念 2.2 哈希冲突&#xff08;哈希碰撞&#xff09; 2.3 哈希函数 2.4 哈希冲突处理 2.4.1 闭散列&#xff08;开放定址法&#xff09; 2.4.1.1 代码实现&#xff1a; 2.4.2 开散列&#xff08;链地址法&…

高职计算机网络实训室

一、高职计算机网络实训室建设的背景 如今&#xff0c;数字化发展已成为国家发展的战略方向&#xff0c;是推动社会进步和经济发展的重要动力。在这一时代背景下&#xff0c;计算机网络技术作为数字化发展的基础设施&#xff0c;其地位和作用愈发凸显。因此&#xff0c;高职院…

Python数据分析-乳腺癌诊断分析预测

一、研究背景 乳腺癌是全球女性中最常见的癌症之一&#xff0c;发病率和死亡率都处于较高水平。据世界卫生组织&#xff08;WHO&#xff09;统计&#xff0c;乳腺癌每年造成数百万女性的死亡&#xff0c;并且其发病率在许多国家呈上升趋势。乳腺癌的早期诊断对于提高患者的生存…

帕金森老人的锻炼建议

对于帕金森病老人来说&#xff0c;适当的锻炼可以帮助改善症状、增强肌肉力量、提高关节灵活性&#xff0c;并预防长期并发症。以下是一些基于最新信息的锻炼建议&#xff1a; 选择合适的运动类型&#xff1a;包括有氧运动、抗阻运动和牵伸运动。有氧运动如快走、慢跑、游泳和舞…

旅游景区度假村展示型网站如何建设渠道品牌

景区、度假村、境外旅游几乎每天的人流量都非常高&#xff0c;还包括本地附近游等&#xff0c;对景区及度假村等固定高流量场所&#xff0c;品牌和客户赋能都是需要完善的&#xff0c;尤其是信息展示方面&#xff0c;旅游客户了解前往及查看信息等。 通过雨科平台建设景区度假…

收银系统源码-视频介绍

千呼新零售2.0系统是零售行业连锁店一体化收银系统&#xff0c;包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体&#xff0c;线上线下数据全部打通。 适用于商超、便利店、水果、生鲜、母婴、服装、零食、百货、宠物等连锁店使用。 详细介绍请…

目标检测基本标注工具-labelImg安装与使用

&#x1f349;一、安装 1.1 打开conda创建虚拟环境&#x1f388; conda create -n labelImg python3.8 -y 1.2 激活labelImg虚拟环境&#x1f388; activate labelImg1.3 安装labelImg&#x1f388; pip install -i https://pypi.tuna.tsinghua.edu.cn/simple lab…

LayoutLMv1

近年来&#xff0c;预训练技术在各种NLP任务中得到了成功的验证。尽管NLP应用程序广泛使用预训练模型&#xff0c;但它们几乎只关注文本级操作&#xff0c;而忽略了对文档图像理解至关重要的布局和样式信息。在本文中&#xff0c;我们提出了LayoutLM来联合建模文本和布局信息在…

【走出阴霾,拥抱阳光】当心情陷入抑郁,我们该如何自救?

在这个快节奏的时代&#xff0c;我们时常会感受到生活的压力和种种不如意。当心情长时间处于低落状态&#xff0c;甚至影响到日常生活时&#xff0c;我们或许已经步入了抑郁的阴影。面对这种情况&#xff0c;我们不必过于恐慌&#xff0c;更不能自暴自弃。接下来&#xff0c;就…

简单分享下利用python做测试的学习方向

做为一名转行过来的工程师&#xff0c;我想分享一下这些年来&#xff0c;我对于技术是怎样晋升的&#xff0c;我是在职&#xff0c;边上班边利用时间学习起来的&#xff0c;也听过很多业内人的分享&#xff08;简单可以总结以下几点&#xff0c;分享给大家碎片的式学习方式&…

Java小白入门到实战应用教程-开发环境搭建-JDK安装详细教程

Java小白入门到实战应用教程-JDK安装详细教程 writer:eleven 开发环境搭建 上节内容补充 在带领大家搭建开发环境前&#xff0c;先来了解一些java领域的名词。 Java根据应用领域区别可分为三个版本&#xff1a; JavaSE&#xff1a;是Java的标准版&#xff0c;提供了Java的…

Java 常用的参数校验,简化参数校验,赶紧学起来!!

Java 常用的参数校验&#xff0c;简化参数校验&#xff0c;赶紧学起来&#xff01;&#xff01;Java中的参数校验注解主要用于简化数据验证的过程&#xff0c;它们允许开发者以声明式的方式指定参数的验证规则&#xff0c;而无需在业https://mp.weixin.qq.com/s?__bizMzkzMTY0…

289个地级市-资源型城市划分数据

资源型城市&#xff1a;经济地理的独特现象与可持续发展的挑战 资源型城市是指那些以丰富的自然资源为基础&#xff0c;对国家经济和工业化进程有着重要影响的城市。这些城市在国家现代化建设中扮演着关键角色&#xff0c;其发展状况直接关系到区域经济的繁荣与社会的稳定。 资…

使用ffmpeg将一个目录下的mkv格式的视频文件转换成mp4格式

最近学剪辑&#xff0c;从BT种子下载的素材资源都是mkv格式的&#xff0c;不能直接导入到视频剪辑软件中。这种情况下需要用一些格式转换工具进行转换&#xff0c;也可以使用ffmpeg进行编辑。 ffmpeg是一个命令行工具&#xff0c;用来对本地的音频视频软件进行编辑。ffmpeg我也…

无人机之电池保养

一、充电时 1、推荐使用官方充电器和充电管家 2、充电时确保电池处于关闭状态 3、冷却后再充电理想充电温度22-28度 二、使用时 1、首次使用需要充电唤醒电池 2、切勿将电池耗尽过放容易造成电池鼓包 三、储存时 1、存放在环境干燥通风的地方 2、不使用时每两个月充一…

【鸿蒙学习笔记】文件管理

官方文档&#xff1a;Core File Kit简介 目录标题 文件分类什么是应用沙箱&#xff1f; 文件分类 应用文件&#xff0c;比如应用的安装包&#xff0c;自己的资源文件等。用户文件&#xff0c;比如用户自己的照片&#xff0c;录制的音视频等。 什么是应用沙箱&#xff1f; 应…

Tomcat下载安装配置教程(零基础超详细)

「作者简介」&#xff1a;冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础著作 《网络安全自学教程》&#xff0c;适合基础薄弱的同学系统化的学习网络安全&#xff0c;用最短的时间掌握最核心的技术。 Tomcat 1、下载…

前端进阶全栈计划:Java基础语法

前言 本教程旨在帮助初学者系统地掌握Java的基础知识。我们将从Java的基本语法开始&#xff0c;逐步深入到面向对象编程、异常处理、多线程编程等核心概念。无论你是编程新手&#xff0c;还是希望夯实基础的开发者&#xff0c;这份指南都将带你走进Java的世界&#xff0c;打下坚…

RISC-V 指令系统

指令系统 指令集 指令集从本质上可以分为复杂指令集&#xff08;Complex Instruction Set Computing&#xff0c;CISC&#xff09;和精简指令集&#xff08;Reduced Instruction Set Computing&#xff0c;RISC&#xff09;两种。复杂指令集的特点是能够在一条指令内完成很多…

STM32智能电网监控系统教程

目录 引言环境准备智能电网监控系统基础代码实现&#xff1a;实现智能电网监控系统 4.1 数据采集模块 4.2 数据处理与分析 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;电网监控与优化问题解决方案与优化收尾与总结 1. 引言 智能电网监控系统通过S…