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]
.
#1. Make an extra copy and then rotate.
Time complexity: O(n). Space complexity: O(n).
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int n = nums.size();
if(n == 0 || k <=0) return;
vector<int> copy(n,0);
for(int i = 0; i < n; ++i){
copy[i] = nums[i];
}
for (int i = 0; i < n; i++)
{
nums[(i + k)%n] = copy[i];
}
}
};
#2. Reverse the first n - k elements, the last k elements, and then all the n elements.
Time complexity: O(n). Space complexity: O(1).
Let the array be - 123456789 and k = 4
Step 1 - 12345 6789 ---> 54321 6789
Step 2 - 54321 6789 ---> 54321 9876
Step 3 - 543219876 ---> 678912345
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int n = nums.size();
k = k%n;
// Reverse the first n - k numbers.
// Index i (0 <= i < n - k) becomes n - k - i.
reverse(nums.begin(), nums.begin() + n - k); //这里是n-k 而不是n-k-1..
// Reverse tha last k numbers.
// Index n - k + i (0 <= i < k) becomes n - i.
reverse(nums.begin() + n - k, nums.end());
// Reverse all the numbers.
// Index i (0 <= i < n - k) becomes n - (n - k - i) = i + k.
// Index n - k + i (0 <= i < k) becomes n - (n - i) = i.
reverse(nums.begin(), nums.end());
}
};