刷题——轮转数组

这篇博客探讨了两种解决数组轮转问题的方法:空间换时间和双重逆置。空间换时间通过创建新数组实现轮转,时间复杂度为O(N);双重逆置则通过三次逆置操作达到目的,同样保持了O(N)的时间复杂度。这两种方法避免了暴力求解的O(N^2)复杂度,适合处理大规模数据。
摘要由CSDN通过智能技术生成

轮转数组

暴力求解

取数+挪动

取数:将数组最后一个数字取出;——K次

挪动:将数组前面的数往后挪动一位;——N次
微信图片_20220707145618.png

因为K最大可能等于N,所以这种方法的时间复杂度是O(N^2),太慢了。在力扣的编译器跑不过去

空间换时间

开辟新数组arr,将nums中后k个数依次放到新数组arr中,再依次将nums中前n-k个数放进arr中。

思路很简单,但实现起来比较难想到,属于是找规律了,
nums的下标和arr的下标应该是要有一定的算术关系的,
以n=7,k=3为例,如图
微信图片_20220707145807.png
时间复杂度位O(N),空间复杂度为O(N)。

void rotate(int* nums, int numsSize, int k){
    int* arr = (int*)malloc(numsSize*sizeof(int));

    for(int i = 0; i < numsSize; i++){
        arr[(i+k) % numsSize] = nums[i]; 
    }

    for(int i = 0; i < numsSize; i++){
        nums[i] = arr[i];
    }
}

双重逆置

将数组前n-k个数逆置,后k个数逆置,再整体逆置,即可。

逆置函数用双指针实现。

void reverse(int *p, int lf, int rg){
    while(lf < rg){
        int tmp = p[lf];
        p[lf] = p[rg];
        p[rg] = tmp;
        lf++;
        rg--;
    }
}

void rotate(int* nums, int numsSize, int k){
    k = k%numsSize; //当k>numsSize时,需将多出的x倍的numsSize除掉。
    reverse(nums, numsSize-k, numsSize-1);
    reverse(nums, 0, numsSize-k-1);
    reverse(nums, 0, numsSize-1);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

裙下的霸气

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值