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].
Pop and Insert
We can loop k times, each time pop an element from the end of array and insert it to the front.
class Solution {
public:
void rotate(vector<int>& nums, int k) {
if ((k <= 0) || (nums.size() <= 1)) {
return;
}
k %= nums.size();
for (int i = 0; i < k; ++i) {
nums.insert(nums.begin(), nums[nums.size() - 1]);
nums.pop_back();
}
}
};
Make a Copy
If we make a copy of the array, it will become very easy to rearrange the elements without being worried that elements are overwritten.
class Solution {
public:
void rotate(vector<int>& nums, int k) {
vector<int> v(nums);
for (int i = 0; i < nums.size(); ++i) {
int j = (i + k) % nums.size();
nums[j] = v[i];
}
}
};
Please note that we can put the checks on every different solution, in case K is very big compared to the size of the array.
if ((k <= 0) || (nums.size() <= 1)) {
return;
}
k %= nums.size();
Reverse three times
Let’s take [1 2 3 4 5 6 7] and n=7, k=4 for example,
1. Swap first n-k elements, so the index i (0 <= i < n - k) becomes n - k - i.
[3 2 1 4 5 6 7]
2. Swap the last k elements, so the index n – k + i (0 <= i < k) becomes n – i.
[3 2 1 7 6 5 4]
3. Swap the entire array, so th index i (0 <= i < n – k) becomes n – (n – k – i) = i + k and the index n – k + i (0 <= i < k) becomes n – (n – i) = i.
[4 5 6 7 1 2 3]
class Solution {
public:
void rotate(vector<int>& nums, int k) {
if ((k <= 0) || (nums.size() <= 1)) {
return;
}
k %= nums.size();
if (k > 0) {
reverse(nums.begin(), nums.begin() + nums.size() - k);
reverse(nums.end() - k, nums.end());
reverse(nums.begin(), nums.end());
}
}
};
There are other in-place solutions using index pointers, but less intuitive.
–EOF (The Ultimate Computing & Technology Blog) —
387 wordsLast Post: How to Remove Duplicates from Sorted Array in C/C++ (Constant Memory)?
Next Post: How to Check Palindrome Linked List in C/C++?