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 tothe right: [7,1,2,3,4,5,6]
rotate 2 steps tothe right: [6,7,1,2,3,4,5]
rotate 3 steps tothe 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 tothe right: [99,-1,-100,3]
rotate 2 steps tothe right: [3,99,-1,-100]
Note:
· Try to come up as many solutions as youcan, there are at least 3 different ways to solve this problem.
· Could you do it in-place with O(1) extraspace?
参考代码:
class Solution {
public:
voidrotate(vector<int>& nums, int k) {
k%=nums.size();
if(k==0) return;
reverse(nums.begin(),nums.end());
reverse(nums.begin(),nums.begin()+k);
reverse(nums.begin()+k,nums.end());
return ;
}
};
法二:自己写函数完成平移操作。
参考代码:
class Solution {
public:
map<int,bool> mp;
voidrotate(vector<int>& nums, int k) {
int n=nums.size(),cnt=1;
k%=n;
if(k==0) return;
for(int i=0;i<k;i++){
int t=nums[i];
for(intj=(i+k)%n;mp[j]!=true;j=(j+k)%n){ //注意是mp[j],不是mp[nums[j]]!=true!!!!!!
swap(nums[j],t);
mp[j]=true; //mp[j]=true;
}
}
return;
}
};