设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N),且只允许使用两个附加变量。
K可能大于N,但对K%N就可。代码如下:
reverse(int* arr,int b,int e){
for(;b<r;b++,e--){
int temp= arr[e];
arr[e] =arr[b];
arr[b] =temp;
}
}
rightShift(int* arr,int n,int k){
k %= n;
reverse(arr,0,n-k-1);
reverse(arr,n-k,n-1);
reverse(arr,0,n-1);
}
时间复杂度为O(n)。很好理解如1234abcd->4321dcba->abcd1234。