轮转数组(时间复杂度不同的三种思路)

news2024/9/22 19:25:21

(来源:LeetCode)

题目

分析

其实一次轮转就是将最后一个数据放到最前面,其他数据整体向后移动一位。k为几就重复这个行为几次。

思路1

我们应该很快能想到最直接的一种思路。while(k--)……循环内完成两件事,保存最后一个数据,将其他数据整体向后移动1位,将最后一个数据放到最前面的位置。

在我们将需要平移的数据向后移动时,同样需要使用到循环。

平台已经给好了函数头,有函数名和参数。我们只需要去补完函数体。

 我们可以先看看给的参数是些什么,第一个是给的数组,第二个是数组长度,第三个是要轮转的次数。

OJ平台是不需要我们写main函数和头文件的。

此时可以看到,点击运行后的用例是通过的。

但是,这个算法真的好吗?

我们点一下提交,多来几个用例看看:

说明我们的算法在数据大时,时间复杂度太大。

我们可以计算这个算法的时间复杂度。

因为numsSize、k都为变量,都可看做N,而外循环执行k次,内循环执行N次左右,所以时间复杂度为O(N²)。

可以看到N²这种复杂度, 变化很抖,也就是程序效能很差。

那么我们现在能不能有更好的算法,也就是不要两层循环的嵌套。

其实在平台的题目下面还有这样一段话:

思路2

现在我们来申请一个新的数组,大小和原数组一样大。

我们知道,其实轮转几次,也可以看做是把原来数组里的几个数据放到最后,将其他的放到前面:

 对应代码:

void rotate(int* nums, int numsSize, int k) 
{
     int newArr[numsSize];
     for (int i = 0; i < numsSize; ++i) 
     {
         newArr[(i + k) % numsSize] = nums[i];
     }
     for (int i = 0; i < numsSize; ++i) 
     {
         nums[i] = newArr[i];
     }
}

newArr[(i + k) % numsSize] = nums[i];这一句代码就能实现两种操作:将开头k个数据放到最后,将剩余数据放到前面。

我们来理解一下这句代码(假设k为3,numsSize为7):

最开始i=0时,3%7,结果为3,所以新数组下标为3的地方放入了1。以此类推,1~4被放入到新数组下标为3 4 5 6的四个位置,也就是最后的四个位置。

直到i为4时,7%7的结果为0,也就是将下标为4,即5放到新数组下标为0的位置。以此类推,5 6 7就被放到了新数组的前三个位置。

最后得到的就是我们要的效果。

但是我们是要改变原数组的,所以还要把重新排好的数据再挪回去。

那么,这个算法的时间复杂度是多少呢?可以看到是2N去掉系数,最后为O(N)。

但是空间复杂度也是O(N),我们申请了新的大小为N的数组空间。也就是说,在这个算法中,我们牺牲了空间换来了时间。

思路2的算法点击提交后,这次我们就通过了。

但这个思路还不是最佳的。我们来看看更巧妙的思路3

思路3 

原数组:              1 2 3 4 5 6 7

• 前n-k个数逆置:4 3 2 1 5 6 7

• 后k个数逆置:   4 3 2 1 7 6 5

• 整体逆置:        5 6 7 1 2 3 4

 我们要做的一件事是逆置。什么是逆置?首先我们在将前n-k个数据进行逆置时,也就是将1234变为了4321,后面的567没有变化。这就是逆置。

我们可以把逆置封装成一个函数。

怎么实现逆置呢?

我们用到两个指针。left与right。left最开始指向第一个数据,right最开始指向最后一个数据,两个数据进行交换。然后left向右走,right向左走,走完再交换。重复这个步骤直到left和right重合时无需再交换。

有了这个思路后我们可以写出代码:

可以看到运行通过,但是当我们提交:

却执行出错。

我们可以在下方看到,当数组中只有一个-1,k=2时,我们的输出与预期输出不符。

我们需要再对k进行一些处理。

这样就保证了我们的k不会超过numsSize。

这时我们的代码就能通过提交了。

只有一个循环,交换N/2次,因为去掉系数,所以这个算法的时间复杂度为O(N);没有额外申请空间或者说只有三次函数调用开辟的函数栈帧,所以空间复杂度为O(1)。

到此,本文结束^_^

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

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

相关文章

【C++】函数重载详解

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…

Python面试全攻略:基础知识、特性、算法与实战解析

随着Python的普及&#xff0c;越来越多的人开始学习Python并尝试在面试中展示自己的技能。在这篇文章中&#xff0c;我们将探讨Python面试需要注意的问题以及一些经典的Python算法。 一、Python面试需要注意的问题 基础知识 在Python面试中&#xff0c;基础知识是非常重要的。…

开源浪潮:助力未来科技的飞速发展

文章目录 开源项目有哪些机遇与挑战&#xff1f;开源项目的发展趋势发展现状开源社区的活跃度 我是如何参与开源项目的经验分享选择开源项目贡献代码 开源项目的挑战开源项目面临的挑战 开源项目有哪些机遇与挑战&#xff1f; 随着全球经济和科技环境的快速变化&#xff0c;开源…

设计模式 - 最简单最有趣的方式讲述

别名《我替你看Head First设计模式》 本文以故事的形式带你从0了解设计模式&#xff0c;在其中你仅仅是一名刚入职的实习生&#xff0c;在项目中摸爬滚打。&#xff08;以没有一行真正代码的形式&#xff0c;让你无压力趣味学习&#xff09; 设计模式 策略模式观察者模式装饰者…

【简历】重庆某一本大学:JAVA简历指导,中厂通过率较低

注&#xff1a;为保证用户信息安全&#xff0c;姓名和学校等信息已经进行同层次变更&#xff0c;内容部分细节也进行了部分隐藏 简历说明 这是一份重庆某一本大学Java同学的简历。那么因为学校是一个一本的学校&#xff0c;就先要确定就业层次在中厂或者大厂&#xff0c;但是…

Zed 编辑器发布了原生 Linux 版本

由 Rust 编写、GPU 加速的 Zed 文本编辑器终于提供了正式的 Linux 原生版本&#xff01;在过去的几个月里&#xff0c;Zed 的 Linux 支持取得了长足的进步&#xff0c;现在已经进入了更正式的阶段。 今天&#xff0c;这款由前 Atom 开发人员创建的现代开源代码编辑器现在在 Li…

算法的几种常见形式

算法&#xff08;Algorithm&#xff09; 算法&#xff08;Algorithm&#xff09;是指解决问题或完成任务的一系列明确的步骤或规则。在计算机科学中&#xff0c;算法是程序的核心部分&#xff0c;它定义了如何执行特定的任务或解决特定的问题。算法可以用多种方式来表示和实现…

如何在小红书上面有效地种草?

文末领取小红书电商开店运营教程&#xff01; 小红书是一个以内容分享为主的社交平台&#xff0c;大家喜欢在这里分享自己的生活体验和心得&#xff0c;其中就包括各种产品的使用感受。 那么我们要想在小红书上有效地种草&#xff0c;首先就需要了解并掌握小红书的种草文化。 …

JavaScript(8)——函数

函数 function,是被设计执行特定任务的代码块。 函数可以把具有相同或相似逻辑的代码包裹起来&#xff0c;通过函数调用执行这些代码&#xff0c;这么做的优势有利于精简代码方便复用。类似于alert(),prompt()和console.log()&#xff0c;这些都是js函数&#xff0c;不过已经…

C++学习书籍推荐

第一本&#xff1a;C Primer CPrimer&#xff1a;主要讲解语法&#xff0c;经典的语法书籍&#xff0c;前后中期都可以看&#xff0c;前期如果⾃学看可能会有点晦涩 难懂&#xff0c;能看懂多少看懂多少&#xff0c;就当预习&#xff0c;中后期作为语法字典&#xff0c;⾮常好⽤…

Android11 SplashScreen 的显示和退出流程

应用的启动到显示到屏幕是需要一定的时间的&#xff0c;为了提升用户的体验&#xff0c;google加入了启动窗口&#xff0c;也就是SplashScreen SplashScreen显示流程 在应用的启动过程中&#xff0c;会调用到ActivityStarter的startActivityInner方法&#xff0c;具体可参考&a…

STM32HAL库+ESP8266+cJSON+微信小程序_连接华为云物联网平台

STM32HAL库ESP8266cJSON微信小程序_连接华为云物联网平台 实验使用资源&#xff1a;正点原子F407 USART1&#xff1a;PA9P、A10&#xff08;串口打印调试&#xff09; USART3&#xff1a;PB10、PB11&#xff08;WiFi模块&#xff09; DHT11&#xff1a;PG9&#xff08;采集数据…

【JavaEE精炼宝库】文件操作(2)——文件内容读写 | IO流

文章目录 一、输入流1.1 InputStream 概述&#xff1a;1.2 read 方法详解&#xff1a;1.3 close 方法&#xff1a;1.4 利用 Scanner 进行读操作&#xff1a;1.5 Reader&#xff1a; 二、输出流2.1 OutputStream 概述&#xff1a;2.2 write 方法详解&#xff1a;2.3 利用 PrintW…

【Sql Server】sql server 2019设置远程访问,外网服务器需要设置好安全组入方向规则

大家好&#xff0c;我是全栈小5&#xff0c;欢迎来到《小5讲堂》。 这是《Sql Server》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 前言1、无法链接…

47、lvs之DR

1、DR模式&#xff1a; 1.1、lvs三种模式&#xff1a; nat 地址转换 DR 直接路由模式 tun 隧道模式 1.2、DR模式的特点&#xff1a; 调度器在整个lvs集群当中是最重要的&#xff0c;在nat模式下&#xff0c;即负载接收请求&#xff0c;同时根据负载均衡的算法转发流量&…

2024 China Joy 前瞻 | 腾讯网易发新作,网易数智携游戏前沿科技、创新产品以及独家礼盒,精彩不断!

今年上半年&#xff0c;CES、MWC和AWE三大国际科技展轮番轰炸&#xff0c;吸引全球科技爱好者的高度关注&#xff0c;无论是新潮的科技产品&#xff0c;还是对人工智能的探索&#xff0c;每一项展出的技术和产品都引起了市场的热议。而到了下半年&#xff0c;一年一度的China J…

springboot商城综合项目自动化系统-计算机毕业设计源码051018

摘 要 目前电商系统商城项目管理极其频繁,迫切地需要自动化测试来代替人工繁琐而又重复的劳动。自动化测试相关的研究已经很多,但多数只是针对某一方面,比如单一接口或者单一页面或者性能等,而缺乏将接口、页面、持续集成系统和缺陷管理系统整合的自动化测试平台。本研究采用混…

ROS——六轴机械臂建模

创建工作空间及目录&#xff08;my_arm&#xff09; 创建launch、urdf文件夹 urdf launch Arm_Model.xacro <?xml version"1.0"?> <robot name"marm" xmlns:xacro"http://www.ros.org/wiki/xacro"><!-- Defining the c…

【Python3】自动化测试_Playwright的安装教程

安装playwright库&#xff1a; pip install playwright 安装内置浏览器&#xff1a; # Install All playwright install# Install chromium playwright install chromium# Install firefox playwright install firefox# Install WebKit playwright install webkit 安装系统…

32.同步FIFO-IP核的调用

&#xff08;1&#xff09;FIFO&#xff08;First In First Out&#xff0c;即先进先出&#xff09;&#xff0c;是一种数据缓冲器&#xff0c;用来实现数据先入先出的读写方式。 &#xff08;2&#xff09;FIFO存储器主要是作为缓存&#xff0c;应用在同步时钟系统和异步时钟系…