1,题目要求
Given an array, rotate the array to the right by k steps, where k is non-negative.
给定一个数组,将数组向右旋转k步。
2,题目思路
整体题目而言不是很难。如果是在O(n)的空间内完成,则重新创建一个vector然后错位进行赋值即可 。
如果在O(1)的空间完成,可以用自带的reverse的方法,先对前n-k个元素进行逆转,然后再对后k个元素进行逆转,最后再整体逆转,就可以得到符合条件的结果。
需要注意的是,k是可能大于数组的长度n的,因此在方法2中,先对k求一次余。
3,程序源码
方法1:
class Solution {
public:
void rotate(vector<int>& nums, int k)
{
vector<int> numCopy (nums.begin(),nums.end());
auto n = nums.size();
for(int i = 0;i < n;i++)
nums[(i+k)%n] = numCopy[i];
}
};
方法2:
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.end());
reverse(nums.begin(), nums.end());
}
};