来源:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/x2skh7/
分析一:若不考虑空间复杂度,在定义一个大小确定的数组,按照循环数组的方式移动存放给定的元素即可。
代码:
class Solution {///消耗额外空间的方法
public:
void rotate(vector<int>& nums, int k) {
int length=nums.size();
vector<int> result(length);///这里需要规定大小,否则后面执行会报错,也是看了官方题解才发现
for(int i=0;i<length;i++){
result[(i+k)%length]=nums[i];
}
nums.assign(result.begin(),result.end());///若不规定大小,此行执行会出现问题
}
};
分析二:将数组先进行整体翻转,在进行两次部分旋转。例如数组 0 1 2 3 4,k=3时 ,整体翻转得 4 3 2 -1 0,然后在两个部分进行翻转得 2 3 4 0 1。
代码:
class Solution {//学习 一下思路,三次调用函数,开销还是蛮大的,用其他的方式实现这种思路可能会好点
public:
void rotate(vector<int>& nums, int k) {
if(nums.size()<2) return;
k=k%nums.size();///若不这样处理,会出现移动的k大于数组长度而报错
reverse(nums.begin(),nums.end());
reverse(nums.begin(),nums.begin()+k);
reverse(nums.begin()+k,nums.end());
}
};