要求:
给定一个数组,将数组中的元素向右移动 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]
说明:
- 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
- 要求使用空间复杂度为 O(1) 的原地算法。
思路一:
结合使用erase()函数以及insert()函数,即每次将数组的倒数第1....k个元素分别插入到数组的首位,插入完成以后使用erase()函数将末尾处片段直接删除,
程序如下:
void rotate(vector<int>& nums, int k) {
int s = nums.size() - 1;
for(int i = 0;i < k;i++){
nums.insert(nums.begin(),nums[s]);
}
nums.erase(nums.end()-k,nums.end());
}
不过这种方法用时较长
思路二:
结合使用erase()函数、pop_end()函数以及insert()函数,每次将末尾处元素插入到首位后,调用pop_end()函数删除掉尾元素,以此循环k次。程序如下:
void rotate(vector<int>& nums, int k) {
int s = nums.size() - 1;
for(int i = 0;i < k;i++){
int a = nums[s];
nums.pop_back();
nums.insert(nums.begin(),a);
}
}