给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
示例 1:
输入: [1,2,3,4,5,6,7] 和 k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右旋转 1 步: [7,1,2,3,4,5,6]
向右旋转 2 步: [6,7,1,2,3,4,5]
向右旋转 3 步: [5,6,7,1,2,3,4]
思路:
最直观的一个个挪,就是模拟右移过程。总共移动k次,外层循环k次。内层循环是取出最后一个存入temp,然后依次右移,最后把temp放回第一个。直观,不易错,但是会超时。。不过还是贴上来:
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int temp = 0;
for(int i = 0 ; i < k ; i++){
temp = nums[nums.size()-1];
for(int j = nums.size()-1; j > 0 ; j--){
nums[j] = nums[j-1];
}
nums[0] = temp;
}
}
};
然后就是借助辅助数组。怎么把原数组的数挪进去,直观思路:按照k的大小,分为前半段和后半段。分别放入辅助数组后再覆盖原nums。但这样带来的问题是,当k小于总长度的时候,会出错。通过查看网上代码,发现一个巧妙的办法是+k后取模。(想到了循环队列)
具体代码:
class Solution {
public:
void rotate(vector<int>& nums, int k) {
vector<int> temp;
temp = nums;
for(int i = 0 ; i < nums.size() ; i++){
temp[(i + k) % nums.size()] = nums[i];
}
for(int i = 0 ; i < nums.size() ; i++){
nums[i] = temp[i];
}
}
};