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.
[show hint]
Hint:
Could you do it in-place with O(1) extra space?
Related problem: Reverse Words in a String II
1 space O(n) time O(n)
class Solution {
public:
void rotate(vector<int>& nums, int k) {
vector<int> tmp;
int len = nums.size();
if(len == 1) return ;
k = k%len;
for(int i = len-k; i<len; i++){
tmp.push_back(nums[i]);
}
for(int i = 0; i<len-k; i++){
tmp.push_back(nums[i]);
}
nums = tmp;
}
};
2 space O(1) time O(n)
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int n = nums.size();
int tmp;
k=k%n;
for(int i = 0,j = n-k-1; i < j; i++,j--){
swap(nums[i],nums[j]);
}
for(int i=n-k,j=n-1; i<j; i++,j--){
swap(nums[i],nums[j]);
}
for(int i=0,j=n-1; i<j; i++,j--){
swap(nums[i],nums[j]);
}
}
};
3 code concise, but a little hard to understand
at first, nums[] is [1,2,3,4,5,6,7], n is 7, k is 3
after first outer loop, nums[] is [5,6,7,4,1,2,3],[5,6,7] is what we want,so we only to look [4,,1,2,3] ,n is 4, k is 3
after second outer loop, nums[] is [4], n is 1, k is 0
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int n = nums.size();
int len = n;
vector<int>::iterator it = nums.begin();
for(; k %= n; n=n-k){
for(int i = 0,j=len-k+i; i<k; i++,j++){
swap(*it++,nums[j]);
}
}
}
};