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.
class Solution {
public:
/*algorithm:
1)rotate right 1 step
2) for k, rotate k times
time O(n*k), space O(1)
*/
//1,2,3,4-->4,1,2,3
void rotate1(vector<int>&nums){
int size = nums.size();
int last = nums[size - 1];
for(int i = size - 1;i > 0;i--)
nums[i] = nums[i-1];
nums[0] = last;
}
void rotate(vector<int>& nums, int k) {
if(k <= 0)return;
k = k % nums.size();
for(int i = 0;i < k;i++)
rotate1(nums);
}
};
class Solution {
public:
/*algorithm 2:
1) reverse whole array
2) for k, reverse left k ,right n - k
time: O(n) space O(1)
*/
void rotateSub(vector<int>&nums,int start,int end){//[start,end]
while(start < end){
swap(nums[start],nums[end]);
start++,end--;
}
}
void rotate(vector<int>& nums, int k) {
if(k <= 0)return;
int n = nums.size();
k = k%n;
rotateSub(nums,0,n-1);
rotateSub(nums,0,k-1);
rotateSub(nums,k,n-1);
}
};
class Solution {
public:
/*algorithm 3:
1) store k part
2) roate right n-k to right
3) store k part to left k
time: O(n) space O(k)
*/
void rotate(vector<int>& nums, int k) {
if(k <= 0)return;
int n = nums.size();
k = k%n;
vector<int>part(nums.end() - k,nums.end());
for(int i = n-k-1;i >= 0;i--)nums[i+k] = nums[i];
for(int i = 0;i < k;i++)nums[i] = part[i];
}
};