c++ - 关于右阵列旋转的杂耍算法
问题描述
最近,我使用 Juggling 算法了解了线性时间的阵列旋转。这是关于数组左旋转的片段。
void ArrayRotate (int A[], int n, int k)
{
int d=-1,i,temp,j;
for(i=0;i<gcd(n,k);i++)
{
j=i;
temp=A[i];
while(1)
{
d=(j+k)%n;
if(d==i)
break;
A[j]=A[d];
j=d;
}
A[j]=temp;
}
}
但现在我被困在如何使用这种杂耍算法以正确的方向旋转阵列。
1,2,3,4,5 (given array)
5,1,2,3,4 (after 1 right rotation)
(我已经使用蛮力法和反转法解决了这个问题。)
解决方案
- 如前所述,如果允许,您应该使用 std::rotate 。
- 您的实现有一个错误。这是一个固定的实现。
void ArrayRotate(int A[], int n, int k) {
int d = -1, i, temp, j;
int g = gcd(n, k);
for (i = 0; i < g; ++i) {
j = i;
temp = A[i];
while (true) {
d = (j + k) % n;
if (d == i) {
break;
}
A[j] = A[d];
j = d;
}
A[j] = temp;
}
}
另请注意,我从循环条件中取出了 gcd 计算。它在技术上不会影响复杂性,但只计算一次 gcd 就足够了。
要将数组k
向右旋转次数,只需将其n - k
向左旋转次数即可。
void ArrayRotateRight(int A[], int n, int k) {
ArrayRotate(A, n, n - k);
}
或者将第 8 行更改为d = (j - k + n) % n;
推荐阅读
- r - R和spark:比较不同地理点之间的距离
- android - 绘制自定义路线
- c# - C# Azure Function v3 依赖注入 - 使用 Scrutor 进行程序集扫描
- python-3.x - 谁能推荐一些机器学习或数据科学方面的好项目?
- css - 如何使用 CSS 更改表情符号的色调?
- mongodb - 选择特定时间范围内的数据集进行聚合
- asp.net-core - INSERT 语句与 FOREIGN KEY 约束冲突,但外键存在
- amazon-web-services - 通过 aws cloudformation 编写脚本并在 EC2 中运行
- python - 检查给定字典中给定多个键是否存在任何键
- mysql - 如何将 MySQL 服务器连接到 Blue Prism?