给定一个数组,将数组中的元素向右移动 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]
示例 2:
输入: [-1,-100,3,99]
和 k = 2
输出: [3,99,-1,-100]
解释:
向右旋转 1 步: [99,-1,-100,3]
向右旋转 2 步: [3,99,-1,-100]
说明:
- 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
- 要求使用空间复杂度为 O(1) 的 原地 算法。
分析:
abcdefg 旋转 3
先反转后3个得到 abcdgfe
再反转前面的那部分得到 dcbagfe
再全部反转得到 efgabcd
即所需结果
class Solution {
public:
void rotate(vector<int>& nums, int k) {
// 确定k不会超过nums.size()
k = k%nums.size();
// 后k个反转
reverse(nums,nums.size()-k,nums.size()-1);
// 前面的全部反转
reverse(nums,0,nums.size()-k-1);
// 全部反转
reverse(nums,0,nums.size()-1);
}
/*
输入: [1,2,3,4,5,6,7] 和 k = 3
输出: [5,6,7,1,2,3,4]
*/
// 反转数组[start,end]的一部分
void reverse(vector<int>& nums, int start, int end){
int num = (end-start+1)/2;
for(int i=0; i<num; i++){
int temp = nums[i+start];
nums[i+start] = nums[end-i];
nums[end-i] = temp;
}
}
};