本题题目要求如下:
Rotate an array of n elements to the right by k steps.
For example, with n = 7 and k = 3, the array [1,2,3,4,5,6,7]
is rotated to [5,6,7,1,2,3,4]
.
Note:
Try to come up as many solutions as you can, there are at least 3 different ways to solve this problem.
Hint:
Could you do it in-place with O(1) extra space?
很丢人,这题我居然没有想出来。。。如果用O(N^2)的时间复杂度,或者是not in-place的算法,都是很好解决的。但是这题都给限定了。。
Could you do it in-place with O(1) extra space?
翻了下讨论区,发现一个特别巧妙的办法。。。但是个人感觉,如果从来没见过类似算法,这题真的不能算是easy。。。。
说明下算法:
1,2,3,4,5,6,7,8,9
移动6,array将会变成4,5,6,7,8,9,1,2,3
所以我们就想有什么不破坏4,5,6,7,8,9的整体结构的基础上将123移动到最后三位,这题采用一个类似镜像的算法
先把1,2,3翻转,变成
3,2,1,4,5,6,7,8,9
然后再将这个整个翻转,这样1,2,3就成了最后三位,且不破坏整体结构
9,8,7,6,5,4,1,2,3
此时,4,5,6,7,8,9序列是倒序的,所以将他们反序即可:
4,5,6,7,8,9,1,2,3
这就是最终结果,详细代码如下:
class Solution {
public:
void rotate(int nums[], int n, int k) {
k %= n;
if (k == 0)
return;
reverse(nums, nums + (n - k));
reverse(nums, nums + n);
reverse(nums, nums + k);
}
};
再上传一个O(n)的版本,稍微简单一些的。。
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int sz = nums.size();
k %= sz;
nums.resize(sz + sz - k);
for (int i = 0; i < sz - k; ++i) {
nums[i+sz] = nums[i];
}
nums.erase(nums.begin(), nums.begin() + sz - k);
}
};