设计算法,把一个含有n个元素的数组循环右移k位,要求时间复杂度为O(n),只允许使用两个附加变量。
解法一:每次将数组中元素右移一位,这样算法能够实现移位,但是算法复杂度为O(k*n),代码如下:
RightShift(int *arr,int n,int k) { while(k--) { int temp=a[n-1]; for(int i=1;i<n;++i) { a[i]=a[i-1]; } a[0]=temp; } }
解法二:右移k位之后的情况跟右移k%n位之后的情况是一样的,算法复杂度为O(n*n),代码如下:
RightShift(int* arr,int k,int n) { k=k%n; while(k--) { temp=a[n-1]; for(int i=1;i<n;++i) { a[i]=a[i-1]; } a[0]=temp; } }
解法三:变换的过程通过以下步骤完成:
1.
2.
3.
代码如下:
Reverse(int* arr,int b,int e) { for(;b<e;b++,e--) { int temp=arr[e]; arr[e]=arr[b]; arr[b]=temp; } } RightShift(int* arr,int n,int k) { k=k%n; Reverse(arr,0,n-k-1); Reverse(arr,n-k,n-1); Reverse(arr,o,n-1); }