2024年最新leetcode刷题之轮转数组(超详解刷爆力扣)_力扣循环数组(3),C C++开发社招面试解答之性能优化

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

大家好啊,我是小生啊🙈🙈🙈
我可没忘记带着大家刷题呢,嘿嘿兄弟姐妹们,我来啦😎😎😎让我们开始我们今天快乐的力扣刷题之旅吧,啦啦啦~~~ 😝😜😙

在这里插入图片描述

🌞🌞🌞 让我们一题多解,刷爆力扣,冲冲冲👊👊👊


力扣练习:轮转数组🏃🏃🏃

一.🏠题目描述

嘿嘿,兄弟们,老规矩,直接看题: 🙊 🙊 🙊

在这里插入图片描述

示例1:
输入:nums = [1,2,3,4,5,6,7], k = 3
输出:[5,6,7,1,2,3,4]

示例2:
输入:nums = [-1,-100,3,99], k = 2
输出:[3,99,-1,-100]

二.🏠题目分析

**兄弟们,这道题目可是力扣里面中等难度的题目呢,我们要好好对待,一定能大有所获的,加油加油!!!**😉😉😉
老规矩啦,一定要读懂题目哦,官方为了让大家理解,特地写这个数组轮转的结果,我们来看一下。
向右轮转 1 步: [7,1,2,3,4,5,6]
向右轮转 2 步: [6,7,1,2,3,4,5]
向右轮转 3 步: [5,6,7,1,2,3,4]

三.🏠解决方法

1.🚀思路一:化尾为头再循环挪动

既然我们这里数组每次轮转时将数据往后挪动,那我们不妨 用一个临时变量把数组最后一个元素存储起来存储起来,接着通过循环将其他前面的数组元素一次往后移动一位,最后把临时变量存储的数据放到数组的开头。也许你觉得小生说得不太清楚,那小生画一张图片让大家理解一下😎😎😎

在这里插入图片描述

都到这里了,相信大家都能理解这种思路了,但是这种每次向右边轮转数组,所有的值就要往后挪一次,时间复杂度较大,那我们有没有什么方法把他优化一下呢?😖😖😖我们看接下来的思路二。😃😃😃

2.🚀思路二:开辟新空间优化时间

前面我们已经说过了,我们要轮转K次,按照之前的方法每次轮转我们都得进行一次移动位置,那我们为什么不选择一次性移位呢?我们可以仔细思考一下,向右轮转K次就是把数组倒数第K个数放到其他数组元素的前面,我们可以用新的数组把这两部分按照后来的顺序存储即可,因此,从空间复杂度的角度来看,该方法的空间复杂度更大,但是从时间复杂度的角度来探讨,确实是优化了许多。同样的道理,小生直接画个图让大家理解一下,画图可累死小生了~~~😭😭

在这里插入图片描述
到了这里我们完成了一半啦,接着往下看:👀👀👀

在这里插入图片描述

最后将新数组的元素再拷贝一份放入原数组就可以了。但是如果K大于数组最大的长度的时候我们会发现出现问题,因此我们待会需要处理一下在这里插入图片描述

3.🚀思路三:三次逆置(大神方法)

先声明,这种方法小生这种菜鸟可想不到,友友们,千万别说我是大佬,我真的是小菜鸟。我们来看看大神的方法,假设我们设为该数组一共有N个元素,轮转K次大神是这样做的,先把后K个数组元素逆置,再把前N-K个数组元素逆置,最后把这个数组来个整体逆置。为了方便大家理解,小生再画个图吧。

在这里插入图片描述
跟着思路走下去💪💪💪
在这里插入图片描述
最后我们发现竟然真的成功了,不愧是大神的方法,时间复杂度和空间复杂度都优化了思路我们分析好了让我们直接上代码吧。
在这里插入图片描述

四.🏠代码实现

1.🚀方法一代码详解

按照我们之前分析的思路,每次轮转时用临时变量存储元素最后一个元素,然后再把其他元素往后覆盖。直接代码走起来👇👇👇👇

void rotate(int\* nums, int numsSize, int k)
{
	//因为数组轮转是由周期的,我们可以通过一下方法简化问题
    k %= numsSize;
    for(int i = 0; i < k; i++)
    {
    	//定义临时变量存放最后一个元素
        int tmp = nums[numsSize - 1];
        //从倒数第二个元素开始从前往后不断覆盖


![img](https://img-blog.csdnimg.cn/img_convert/9f697a8f02dffbbf52e1963a240656fc.png)
![img](https://img-blog.csdnimg.cn/img_convert/aa7188a76faa8ae7818ee80180f4c99e.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

正的技术提升。**

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值