leetcode之rotate array

Rotate an array of n elements to the right by k steps.

For example, with n = 7 and k = 3, the array [1,2,3,4,5,6,7] is rotated to [5,6,7,1,2,3,4]

Note:
Try to come up as many solutions as you can, there are at least 3 different ways to solve this problem.


1.首先想到的是最简单的方法:就是右移k次,复杂度O(N2),超时了

2.然后百度了一下,看到了一个不错的方法:分三步:1)把倒数第k个数之前的所有数做倒序处理,2)再把第k个数到最后一个数做倒序处理,3)把整个数组倒序处理,感觉这个方法也很神奇,但是我没用这个方法

参考:http://www.shangxueba.com/jingyan/2923921.html

3.我最后想出来的方法:用递归做,首先分为k == numsSize||k == 0 和 k <= numsSize/2 和 k > numsSize/2三种情况,

k == numsSize||k == 0时,返回

k <= numsSize/2时,将倒数k个数与最前面k个数整体交换位置,然后前k个数位置就对了,然后递归处理后面n-k个数,rotate(nums+k,numsSize-k,k);

k > numsSize/2时,分成两步处理,先右移n/2,再右移k-n/2,这样就可以调用递归处理了, rotate(nums,numsSize,numsSize/2); rotate(nums,numsSize,k-numsSize/2);

源代码(C语言):

void rotate(int* nums, int numsSize, int k) {
    k=k%numsSize;
    int i,j,tmp;
    if(numsSize==k||k==0) return;
    if(k<=numsSize/2)  
    {
        for(i=0,j=numsSize-k;i<k;i++,j++)
        {
            tmp=nums[i];
            nums[i]=nums[j];
            nums[j]=tmp;
        }
        rotate(nums+k,numsSize-k,k);
    }
    else
    {
        rotate(nums,numsSize,numsSize/2);
        rotate(nums,numsSize,k-numsSize/2);
    }
    return;
}

这回就快了

Runtime: 8 ms


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值