【发布时间】:2017-07-25 00:43:51
【问题描述】:
这种圆形阵列旋转的线性复杂度实现是否正确?
n = 元素数 k = 转数
int write_to = 0;
int copy_current = 0;
int copy_final = a[0];
int rotation = k;
int position = 0;
for (int i = 0; i < n; i++) {
write_to = (position + rotation) % n;
copy_current = a[write_to];
a[write_to] = copy_final;
position = write_to;
copy_final = copy_current;
}
【问题讨论】:
-
嗯,复杂性肯定是线性的。但是,如果您希望通过将数组中的值全部移动
#rotation位置来旋转数组中的值,传统上被描述为圆形旋转,那么当这不是您最终会得到的结果时,您会感到惊讶。 -
@vadim:该问题的公认答案当然是正确的,但更漂亮的解决方案是: 1. 反转前 k 个元素。 2.反转其余元素。 3. 反转整个数组。 (所有的反转都在原地。)
-
是的。我喜欢! :)