旋转数组,
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].
非常简单,如果不考虑空间的话,很容易写出O(N)的空间复杂度的代码:
void rotate(int* nums, int numsSize, int k) {
k = k%numsSize;
int *tmpArr = (int *)malloc(sizeof(int)*numsSize);
if(!tmpArr)return;
int j=0;
for(int i=numsSize-k;i<numsSize;i++)
tmpArr[j++]=nums[i];
for(int m=0;m<numsSize-k;m++)
tmpArr[j++]=nums[m];
for(int n=0;n<numsSize;n++)
nums[n]=tmpArr[n];
}
还有一种O(1)的空间复杂度的,考虑的想法是假设对于上面这个数组,我们可以先将前面一半的1,2,3,4翻转4,3,2,1;再将后面一部分5,6,7翻转成7,6,5,那么整个数组就是4,3,2,1,7,6,5,再将整个数组翻转一次就得到最终的答案了。
void rotate(int* nums, int numsSize, int k) {
k = k%numsSize;
reverse(nums,0,numsSize-k-1);
reverse(nums,numsSize-k,numsSize-1);
reverse(nums,0,numsSize-1);
}
void reverse(int *nums,int start,int end)
{
int i=start,j=end;
while(i<j)
{
int tmp;
tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
i++;
j--;
}
}