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