1、题目描述
2、分析
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
这道题最容易想到的是复制一个一样的数组,然后根据需要移动的位置更改原数组的值。但是这样的空间复杂度是O(n)。所以我们需要想别的办法,有一个很巧妙的办法就是,使用STL里面的push_back()和erase()函数,将数组的第一个数插入到数组的最后,再将第一个数删除。这样循环的次数就是,数组的大小减去移动的位置。还有一个注意的问题是,如果移动的位置数对数组的大小取余等于0的话,那么其实就可以直接返回,因为在移动了这么多位置之后,数组的顺序是没有变化的。同理,我们可以对k进行简化,如果k值大于数组的size,那么如果不对k进行处理可能会出现错误。所以,当k大于数组大小时,将k的值设置为k对数组大小取余。这样不仅避免错误也能简化循环次数。
3、代码
class Solution {
public:
void rotate(vector<int>& nums, int k) {
if(nums.empty()||(k%=nums.size())==0) return ;
int k2=k%nums.size();
int n=nums.size();
for(int i=0;i<n-k2;i++){
nums.push_back(nums[0]);
nums.erase(nums.begin());
}
}
};
4、相关知识点
有时候使用STL自带的函数可以简化很多问题。需要熟悉STL。