【Leetcode】轮转数组

文章介绍了如何使用C++解决LeetCode中的轮转数组问题,提供了两种方法:一是开辟新的内存空间并进行拷贝操作,二是利用双指针进行三次逆序操作。对于开辟新空间的方法,文章强调了处理k与numsSize关系的重要性以避免不必要的翻转。而双指针方法则更注重于巧妙地利用逆序操作来达到旋转效果。
摘要由CSDN通过智能技术生成

在这里插入图片描述

👦个人主页:@Weraphael
✍🏻作者简介:目前学习C++和算法
✈️专栏:Leetcode
🐋 希望大家多多支持,咱一起进步!😁
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注


一、题目描述

链接:轮转数组

在这里插入图片描述

二、思路及代码实现

2.1 法一:开辟内存空间

思路:
首先可以开辟一个新的空间,然后将数组后k个元素拷贝到新空间前面,再将原数组前n - k个放入在新空间后面,最后再把新空间中的所有元素拷贝到原数组即可。

【动图展示】

在这里插入图片描述

【代码实现】

在这里插入图片描述

通可以写出上述代码,但是通过不了。这是为什么呢?通过走读代码就会发现
在这里插入图片描述
所以,可以这么想:假设有这么一串数据1、2、3。当k = numsSize,相当于没有翻转(无变化)。如果k = 4,相当于只翻转了一次,如果k = 5,也就相当于翻转2次。所以可以在开头加上k %= numsSize即可

【AC代码】

void rotate(int* nums, int numsSize, int k)
{
    k %= numsSize;
    //1.开辟新空间
    int* tmp = (int*)malloc(sizeof(int) * numsSize);
    //2.拷贝后k个
    memcpy(tmp,nums + numsSize - k,sizeof(int) * k);
    //3.再拷贝原数组n - k到新空间
    memcpy(tmp + k,nums,sizeof(int) * (numsSize - k));
    //3.最后再拷贝回原数组
    memcpy(nums,tmp,sizeof(int) * numsSize);
    //养成编写习惯,记得释放掉空间,防止内存泄漏
    free(tmp);
}

在这里插入图片描述

2.2 法二:双指针

思路

  1. 先逆序后k个数
  2. 再逆序numsSize - k个数
  3. 最后再逆序整个数组

最后由于3次逆序,因此可以写一个函数方便复用

【动画展示】

在这里插入图片描述

【代码实现】

void reverse(int* left,int* right)
{
    while (left < right)
    {
        int tmp = *left;
        *left = * right;
        *right = tmp;
        left++;
        right--;
    }
}
void rotate(int* nums, int numsSize, int k)
{
    k %= numsSize;
    //1.逆序后k个数
    reverse(nums + numsSize - k,nums + numsSize - 1);
    //2.逆序numsSize - k个数
    reverse(nums,nums + numsSize - k - 1);
    //3.最后逆序整个数组
    reverse(nums,nums + numsSize - 1);
}

【AC通过】

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值