设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N),且只允许使用两个附加变量。
不合题意的解法如下:
我们先试验简单的办法,可以每次将数组中的元素右移一位,循环K次。abcd1234--->4abcd123--->34abcd12--->234abcd1--->1234abcd。代码如下所示:
RightShift(int *arr, int N, int K)
{
while(K--)
{
int t = arr[N - 1];
for(int i = N - 1 ; i > 0 ; i--)
{
arr[i] = arr[i - 1];
}
arr[0] = t;
}
}
虽然这个算法可以实现数组的循环右移,但是算法复杂度为O(K*N),不符合题目的要求,要继续探索。
分析与解法
假如数组为abcd1234,循环右移4位的话,我们希望达到的状态是1234abcd。不妨设K是一个非负的整数,当K为负整数的时候&#