题目:
Given an array, rotate the array to the right by k steps, where k is non-negative.
Example 1:
Input:[1,2,3,4,5,6,7]
and k = 3 Output:[5,6,7,1,2,3,4]
Explanation: rotate 1 steps to the right:[7,1,2,3,4,5,6]
rotate 2 steps to the right:[6,7,1,2,3,4,5]
rotate 3 steps to the right:[5,6,7,1,2,3,4]
Example 2:
Input: [-1,-100,3,99]
and k = 2
Output: [3,99,-1,-100]
Explanation:
rotate 1 steps to the right: [99,-1,-100,3]
rotate 2 steps to the right: [3,99,-1,-100]
Note:
- Try to come up as many solutions as you can, there are at least 3 different ways to solve this problem.
- Could you do it in-place with O(1) extra space?
代码:
方法一——:
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int len = nums.size();
k = k%len;
if(k==0)return;
for (int i = len - k - 1; i >= len%k; i--) {
int t = nums[i + k];
nums[i + k] = nums[i];
nums[i] = t;
}
for (int i = 0; i < len%k; i++) {
int temp = nums[0];
for (int j = 1; j < len%k + k; j++) {
nums[j - 1] = nums[j];
}
nums[len%k + k - 1] = temp;
}
}
};
方法二——:
class Solution {
public:
void rotate(vector<int>& nums, int k) {
vector<int> v;
int len=nums.size();
k=k%len;
if(k==0)return;
for(int i=len-k;i<len;i++){
v.push_back(nums[i]);
}
for(int i=len-k-1;i>=0;i--){
nums[i+k]=nums[i];
}
for(int i=0;i<k;i++){
nums[i]=v[i];
}
}
};
方法三——(reverse前半部分,reverse后半部分,reverse整体):
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int n=nums.size();
k = k%n;
reverse(nums.begin(), nums.begin() + n - k);
reverse(nums.begin() + n - k, nums.begin() + n);
reverse(nums.begin(), nums.begin() + n);
}
};
方法四——(reverse整体,reverse前半部分,reverse后半部分):
class Solution {
public:
void rotate(vector<int>& nums, int k) {
k %=nums.size();
reverse(nums.begin(), nums.end());
reverse(nums.begin(), nums.begin()+k);
reverse(nums.begin()+k, nums.end());
}
};