文章目录
0. 循环移位
0.0 问题
仅用O(1)辅助空间,将数组A[O,n)中的元素向左循环移动k个单元。
1. 蛮力版 O(n*k)
算法思想:减而治之,实现移动1位,然后再循环k位。
1.1 代码示例
int shift ( int* A, int n, int s, int k ) {
//从A[s]出发,以k为间隔循环左移,O(n / GCD(n, k))
int bak = A[s]; //备份起始元素
int i = s, j = ( s + k ) % n; //从该元素出发
int mov = 0; //移动次数
while ( s != j ) {
//以k为间隔
A[i] = A[j]; //依次左移k位
i = j; j = ( j + k ) % n; mov++;
}
A[i] = bak; //将起始元素转入对应位置
return mov + 1;
}
/*DSA*/int shift ( int* A, int n, int s, int t ); //从A[s]出发,以t为间隔循环左移,O(3n)
int shift0 ( int* A