这是这个问题的算法:旋转i个位置左边的n个元素的数组。例如,当n = 8且i = 3时,数组abcdefg将旋转到defghabc。
/* Alg 1: Rotate by reversal */
void reverse(int i, int j)
{ int t;
while (i < j) {
t = x[i]; x[i] = x[j]; x[j] = t;
i++;
j--;
}
}
void revrot(int rotdist, int n)
{ reverse(0, rotdist-1);
reverse(rotdist, n-1);
reverse(0, n-1);
}
这种方法的时间复杂度是多少?有没有更好的解决方案来解决这个问题? 非常感谢。
答案 0 :(得分:0)
应大致为线性O(n)
。
答案 1 :(得分:0)
循环必须不超过(i + j)/ 2次。丢弃常数O(i + j)。
答案 2 :(得分:0)
Big-O表示法:
n总是O(n)。 (循环,因为它们必须经历几次迭代)
1所以O(1)。 (如果声明,指定数量)
答案 3 :(得分:0)
同意,它是O(n),因为我们只是转移。
作为思考的食物,另一种可能的算法是制作一个新的数组,其原件附加到自身(即abcd - &gt; abcdabcd)。然后将指针右移n次!当然,你需要两个指针,一个用于结束,一个用于开头。记得用'\ 0'
切断结尾相同的运行时间顺便说一句。