QUESTION
长度为 n
的数组,将其中的所有元素循环左移 p
个位置
SOLUTION
使用空间复杂度为 O(n)
的方法很简单,这里不在叙述,下面介绍一种原地算法
方法一
时间复杂度 O(n)
,空间复杂的 O(1)
// 伪代码
Array.Reverse(0, p-1)
Array.Reverse(p, n-1)
Array.Reverse(0, n-1)
C++ 实现
// 反转指定区间
void Reverse(int array[], int left, int right)
{
int tmp;
for(int i = 0; i < (right - left + 1)/2; i++)
{
tmp = array[left+i];
array[left+i] = array[right-i];
array[right-i] = tmp;
}
}
// 循环左移移动 p 个位置
void Converse(int array[], int n, int p)
{
Reverse(array, 0, p-1);
Reverse(array, p, n-1);
Reverse(array, 0, n-1);
}
按照这个思路,循环右移也很容易实现