Question
设计一个算法,将数组A[n]中的元素A[0]至A[n-1]循环右移k位,并要求只用一个元素大小的附加存储,元素移动或交换次数为O(n)。
Solution
对于要求只有一个元素大小的附加存储的循环右移,可以分为以下3步进行:
- 1 对所有n个元素逆序;
- 2 对前k个元素逆序;
- 3 对后n-k个元素逆序。
由于逆序可以只占用一个元素大小,元素交换次数为O(n),该算法可以满足题目要求。
算法的C语言实现:
1 | void rotateRight(int* A, int n, int k) |