https://leetcode-cn.com/problems/rotate-array/
解法一:首先取k=k%numsSize(因为移numsSize个位置和不移动是一样的结果)。注意到下标为i的元素向右轮转k个位置后,元素的新位置下标为(i+k)%numsSize,索性创建一个新数组,用来存储元素移动后的结果。最后把新数组拷贝回原数组。
void rotate(int* nums, int numsSize, int k){
k%=numsSize; //0<=k<numsSize
int* a=(int*)malloc(sizeof(int)*numsSize);
for(int i=0;i<numsSize;i++){
a[(i+k)%numsSize]=nums[i];
}
// (i+k)%numsSize
for(int i=0;i<numsSize;i++){
nums[i]=a[i];
}
free(a);
}
解法二:由于第一种解法创建了一个新数组,总觉得浪费了内存空间,去看了官方题解,发现了一种相对简单的解法,把空间复杂度从O(n)降为O(1)。基本思路就是反转三次数组。
void change(int*nums,int left,int right){
while(left<=right){
int change=nums[left];
nums[left]=nums[right];
nums[right]=change;
left++;
right--;
}
}
void rotate(int* nums, int numsSize, int k){
k%=numsSize;
change(nums,0,numsSize-1);
change(nums,0,k-1);
change(nums,k,numsSize-1);
}