【Leetcode】轮转数组

在这里插入图片描述

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


目录

  • 一、题目描述
  • 二、思路及代码实现
      • 2.1 法一:开辟内存空间
      • 2.2 法二:双指针

一、题目描述

链接:轮转数组

【Leetcode】轮转数组_第1张图片

二、思路及代码实现

2.1 法一:开辟内存空间

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

【动图展示】

【Leetcode】轮转数组_第2张图片

【代码实现】

【Leetcode】轮转数组_第3张图片

通可以写出上述代码,但是通过不了。这是为什么呢?通过走读代码就会发现
【Leetcode】轮转数组_第4张图片
所以,可以这么想:假设有这么一串数据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);
}

【Leetcode】轮转数组_第5张图片

2.2 法二:双指针

思路

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

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

【动画展示】

【Leetcode】轮转数组_第6张图片

【代码实现】

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通过】

【Leetcode】轮转数组_第7张图片

你可能感兴趣的:(LeetCode,leetcode,算法,数据结构)