问题:把一个含有N个元素的数组循环右移K位,要求时间复杂度O(N),且只允许使用两个额外变量。
思路一:循环K次,每次循环右移一位。
代码:
void RightShift(int *A,int N,int K)
{
while(K--)
{
int t = A[N-1];
for(int i = N-1; i > 0; i--)
{
A[i] = A[i-1];
}
A[0] = t;
}
} 思路二:考虑循环右移N次数组无变化。
代码:
void RightShift2(int *A,int N,int K)
{
K %= N;
while(K--)
{
int t = A[N-1];
for(int i=N-1;i>0;i--)
{
A[i] = A[i-1];
}
A[0] = t;
}
}
思路三:
数组1234abcd,循环右移4位的结果,为abcd1234,可以分三步得到,逆序abcd——>1234dcba,逆序1234——>4321dcba,全部逆序abcd1234。
代码:
void Reverse(int *A,int b,int e)
{
for(;b<e;b++,e--)
{
int t = A[b];
A[b] = A[e];
A[e] = t;
}
}
void RightShift3(int *A,int N,int K)
{
K %= N;
Reverse(A,0,N-1-K);
Reverse(A,N-K,N-1);
Reverse(A,0,N-1);
} 测试:
#include <iostream&g

本文探讨如何在O(N)的时间复杂度内,利用两个额外变量将一个包含N个元素的数组循环右移K位。通过两次逆序操作,实现了数组元素的高效移动。具体步骤包括先对数组进行一次逆序,再对前K个元素逆序,最后对整个数组逆序,从而达到循环右移的效果。
最低0.47元/天 解锁文章
418

被折叠的 条评论
为什么被折叠?



