轮转数组(超详细!)

news2024/9/24 21:22:57

前言:

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

目录:

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.coloradmin.cn/o/1920756.html

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

相关文章

木舟0基础学习Java的第十六天(异常,分类,自定义异常,注意事项)

异常 异常概述&#xff1a;异常是Java程序运行过程中出现的错误 异常分类&#xff1a;API查找Throwable 1.Error(服务器宕机&#xff0c;数据库崩溃等) 2.Exception C(异常的继承体系)API查RuntimeException 运行时异常&#xff1a;一般是程序员的错误异常可以让我们发现错…

LiveNVR监控流媒体Onvif/RTSP用户手册-用户管理:编辑、添加用户、关联通道、重置密码、删除、过滤搜索

LiveNVR监控流媒体Onvif/RTSP用户手册-用户管理:编辑、添加用户、关联通道、重置密码、删除、过滤搜索 1、用户管理1.1、添加用户1.2、关联通道1.3、重置密码1.4、编辑1.5、删除1.6、过滤搜索 2、RTSP/HLS/FLV/RTMP拉流Onvif流媒体服务 1、用户管理 1.1、添加用户 点击用户管理…

【源码开源】C#桌面应用开发:串口调试助手

c#桌面应用开发 1、环境搭建和工程创建&#xff1a;参照番茄定时器项目 工程创建参照 2、界面布局设计 3、具体功能函数 &#xff08;1&#xff09;端口扫描&#xff1a; private void btn_com_scan_Click(object sender, EventArgs e){//端口号扫描ReflashPortToComboBox(…

【JavaWeb程序设计】JavaBean(二)

目录 一、请设计并实现下面的Web应用 1. 运行结果 2. inputNumber.jsp代码 3. ComputerBean.java代码 4. handleCompute 5. lookResult.jsp 二、基于MVC模式完成用户注册功能&#xff0c;不允许添加重名用户&#xff0c;使用AJAX技术在用户填写时进行检查并提示是否重复&…

【产品经理】WMS多仓调拨转移说明

对于仓储管理来说&#xff0c;越来越多企业开始应用WMS进行系统化的管理&#xff0c;以提升仓库的作业效率。本文作者从业务流程和基础功能两个方面展开介绍&#xff0c;希望对你有帮助。 一、业务流程 。在线下业务流程拓展&#xff0c;仓库不断增多的过程中&#xff0c;由于…

[leetcode]circular-array-loop 环形数组是否存在循环

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:bool circularArrayLoop(vector<int>& nums) {int n nums.size();auto next [&](int cur) {return ((cur nums[cur]) % n n) % n; // 保证返回值在 [0,n) 中};for (int i 0; i < n; i…

Apache AGE 运算符

运算符 字符串特定比较运算符 测试数据 SELECT * FROM cypher(graph_name, $$ CREATE (:Person {name: John}),(:Person {name: Jeff}),(:Person {name: Joan}),(:Person {name: Bill}) $$) AS (result agtype);Starts With 对字符串执行区分大小写的前缀搜索。 SELECT * …

Vue2-集成Element-ui、Fontawesome、Axios介绍与使用

文章目录 前期准备Element UI介绍Element-ui安装使用Fontawesome介绍Fontawesome安装使用Axios介绍Axios安装使用本篇小结 更多相关内容可查看 前期准备 脚手架生成vue2项目&#xff1a;NodeJS安装并生成Vue脚手架(保姆级) Element UI介绍 Element UI 是一个基于 Vue.js 2.0…

【Node.js安装教程】

Node.js安装教程 第一步&#xff1a;下载 下载链接&#xff1a;https://nodejs.org/zh-cn 第二步&#xff1a;安装 **方法一&#xff1a;**建议安装在默认路径 方法二&#xff1a;如果不是默认安装路径可能会出现一系列问题&#xff1a;这时可以选择卸载重装或者配置环境变量…

将vue项目整合到springboot项目中并在阿里云上运行

第一步&#xff0c;使用springboot中的thymeleaf模板引擎 导入依赖 <!-- thymeleaf 模板 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency> 在r…

帕金森老人的锻炼建议

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

Python酷库之旅-第三方库Pandas(017)

目录 一、用法精讲 41、pandas.melt函数 41-1、语法 41-2、参数 41-3、功能 41-4、返回值 41-5、说明 41-5-1、宽格式数据(Wide Format) 41-5-2、长格式数据(Long Format) 41-6、用法 41-6-1、数据准备 41-6-2、代码示例 41-6-3、结果输出 42、pandas.pivot函数 …

.net C# 使用网易163邮箱搭建smtp服务,实现发送邮件功能

功能描述&#xff1a;使用邮箱验证实现用户注册激活和找回密码。邮箱选择网易163作为smtp服务器。 真实测试情况&#xff1a;第一种&#xff1a;大部分服务器运行商的25端口默认是封禁的&#xff0c;可以联系运营商进行25端口解封&#xff0c;解封之后可以使用25端口。第二种&…

电力需求预测挑战赛笔记 Taks1 跑通baseline

#AI夏令营 #Datawhale #夏令营 赛题 一句话介绍赛题任务可以这样理解赛题&#xff1a; 【训练时序预测模型助力电力需求预测】 电力需求的准确预测对于电网的稳定运行、能源的有效管理以及可再生能源的整合至关重要。 赛题任务 给定多个房屋对应电力消耗历史 N 天的相关序列数…

Comparable 和 Comparator 接口的区别

Comparable 和 Comparator 接口的区别 1、Comparable 接口1.1 compareTo() 方法 2、Comparator 接口2.1 compare() 方法 3、 Comparable 和 Comparator 的区别总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java中&#xff0c;Compa…

网络钓鱼中的高级同形异义:网络安全的新威胁

网络安全正面临一个潜在的新威胁&#xff1a;在网络钓鱼攻击中使用同形异义词。 这篇调查文章探讨了同形异义现象如何在各种类型的网络钓鱼攻击中使用、其背后的技术。 对这种恶意行为的研究以及高级语言模型 (LLM) 如何帮助加速同形异形现象的研究。 什么是同形异义&#xf…

SpringCloud--Eureka集群

Eureka注册中心集群 为什么要集群 如果只有一个注册中心服务器&#xff0c;会存在单点故障&#xff0c;不可以高并发处理所以要集群。 如何集群 准备三个EurekaServer 相互注册&#xff0c;也就是说每个EurekaServer都需要向所有的EureakServer注册&#xff0c;包括自己 &a…

感应触摸芯片集成为MCU,深度应用触控按键技术的VR眼镜

VR&#xff08;Virtual Reality&#xff09;即虚拟现实&#xff0c;简称VR&#xff0c;其具体内涵是综合利用计算机图形系统和各种现实及控制等接口设备&#xff0c;在计算机上生成的、可交互的三维环境中提供沉浸感觉的技术。它的工作原理是将左右眼图像交互显示在屏幕上的方式…

40个高阶ChatGPT学术论文指令集(附GPT使用链接)

我精心挑选的40个顶尖ChatGPT学术论文指令集&#xff0c;无疑将成为你撰写论文和开展研究的珍贵资源&#xff0c;极力推荐你珍藏起来&#xff01;这些建议极具实用价值&#xff0c;能有效提高你的研究工作效率&#xff0c;使得论文撰写过程轻松许多。 在开始前&#xff0c;提示…

在 Java 中进行类似于 Python 的系统调用

1、问题背景 Python 中有一个内置函数 popen2&#xff0c;可以用来执行系统命令并获取其输出和状态信息。在 Java 中&#xff0c;是否有与之类似的函数或类&#xff0c;可以实现同样的功能&#xff1f; 2、解决方案 方法一&#xff1a;使用 Process 对象 Java 中可以使用 P…