狂刷力扣 *第189题轮转数组题解

本文探讨了如何改进旋转数组的算法,从初始的线性时间复杂度提升到更高效的O(n)。首先介绍了原始的轮转方法及其问题,然后提出了一种通过逆置操作简化步骤的方法,最后强调了算法优化在时间和空间效率上的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

针对这道题我有两种思路

解法一:

遍历轮转,新开辟一个中间变量temp,用于存放nums[numsSize-1],之后开始遍历数组进行交换.实现代码如下

void rotate(int* nums, int numsSize, int k)
{
    int temp = 0;
    int i = 0;
    int numsS=numsSize;//储存数据
    if (k > numsSize)
    {
        k = k % numsSize;//轮转k次相当于轮转了一周,省去计算冗余
    }
    for(i=0;i<k;i++)
    {
     temp = nums[numsSize - 1];//更新数组末值
     while (numsSize-1)
    {
        nums[numsSize - 1] = nums[numsSize - 2];
        numsSize--;
    }
    nums[0] = temp;
    numsSize =numsS;//重置数据,方便下次循环
   }
}

虽然实现了目的,但是这个算法实际上还不够好,它的时间复杂度竟然达到了

O(k*n),数据如果少还可以蒙混过关,但是这样不行

 你看,就连力扣都觉得这样不行,所以我们要进行算法优化。

解法二:

先把后k项逆置,再逆置前numsSize-k项,再将数组整体逆置。

void Revise(int* nums, int left, int right)//逆置函数
{
    int temp = 0;
    while (right > left)
    {
        temp = nums[left];
        nums[left] = nums[right];
        nums[right] = temp;
        right--;
        left++;
    }
}
void rotate(int* nums, int numsSize, int k)
{
    if (k > numsSize)
    {
        k = k % numsSize;
    }
    Revise(nums, numsSize - k, numsSize - 1);//后k项逆置
    Revise(nums, 0, numsSize - k - 1);//前numsSize-k项逆置
    Revise(nums, 0, numsSize - 1);//数组整体逆置

这样一步到位,算法的时间复杂度为O(n),相比上面那个算法要好得多。

需要注意的是,Revise函数使用时,需要框好数组的范围,在评价一个算法的好坏时,善于利用时间复杂度,空间复杂度的思想。

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

星河枕梦

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

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

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

打赏作者

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

抵扣说明:

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

余额充值