<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">Rotate an array of n elements to the right by k steps.</span>
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.
[show hint]
Hint:
Could you do it in-place with O(1) extra space?
解题思路:
给定一个数组,然后将其向右循环k个元素。例如给定的例子,数组[1,2,3,4,5,6,7],向右循环三次,其数组为[5,6,7,1,2,3,4]。实际上将数组分为两部分N-K,K两部分。然后将两部分的顺序进行置换。
方法一:额外建一个vector变量,然后先存储N-K部分的数值,然后存储K部分的数组,最后将该数组赋值给原来的数组。
代码如下:
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int n=nums.size();
if(n==1)
{
return ;
}
k=k%n;
vector<int> newnums;
for(int i=n-k;i<n;i++)
{
newnums.push_back(nums[i]);
}
for(int i=0;i<n-k;i++)
{
newnums.push_back(nums[i]);
}
nums=newnums;
}
};
该方法也可以直接将数组切成两部分,然后进行赋值。
代码如下:
class Solution {
public:
void rotate(vector<int>& nums, int k)
{
int n=nums.size();
if(n==1)
{
return ;
}
k=k%n;
vector<int> extra(nums.begin(), nums.begin() +n- k);
nums.erase(nums.begin(), nums.begin() +n- k);
nums.insert(nums.end(), extra.begin(), extra.end());
}
};