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.
void rotate(int* nums, int numsSize, int k) {
int *a=(int*)malloc(sizeof(int)*numsSize);
int n_index, a_index;
a_index=k%numsSize;
n_index=0;
for( ; n_index<numsSize-k%numsSize; ++n_index) {
a[a_index++]=nums[n_index];
}
for(a_index=0 ; n_index<numsSize; ++n_index) {
a[a_index++]=nums[n_index];
}
for(n_index=0; n_index<numsSize; ++n_index) {
nums[n_index]=a[n_index];
}
}
还有一种比较笨的方法,就是循环将末尾的一个移动到最前面,
但是leetcode上超时。
void moveTail(int *nums, int numsSize) {
int temp=nums[numsSize-1];
for(int i=numsSize-1; i>0; --i) {
nums[i]=nums[i-1];
}
nums[0]=temp;
}
void rotate(int *nums, int numsSize, int k) {
int rtime=k%numsSize;
for(int i=0; i<rtime; ++i) {
moveTail(nums, numsSize);
}
}
还有一种时间为O(n),空间为O(1)的算法。
以n-k为界,两边分别作反转,最后再做一个整体反转。
void reverse(int *nums, int begin, int end) {
if(begin == end) {
return ;
}
while(begin<end) {
int temp=nums[begin];
nums[begin]=nums[end];
nums[end]=temp;
++begin;
--end;
}
}
void rotate(int *nums, int numsSize, int k) {
if(nums==NULL || numsSize<=0 || k<=0) {
return ;
}
int rtime=k%numsSize;
reverse(nums, 0, numsSize-rtime-1);
reverse(nums, numsSize-rtime, numsSize-1);
reverse(nums, 0, numsSize-1);
}