题目:https://leetcode-cn.com/explore/featured/card/top-interview-questions-easy/1/array/23/
给定一个数组,将数组中的元素向右移动 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) 的 原地 算法。
一、居然能通过!
class Solution {
public:
void rotate(vector<int>& nums, int k) {
if(nums.size()==0 || k==0) return ;
k = k % nums.size();
int len = nums.size();
vector<int> p(len+1,0);
for(int i = 0;i<len;i++) p[i] = nums[i];
for(int i = 0;i<len;i++) nums[ (i+k)%len ] = p[i];
}
};
二、手工模拟——超时
class Solution {
public:
void rotate(vector<int>& nums, int k) {
if(nums.size()==0 || k==0) return ;
k = k % nums.size();
for(int i = 1;i<=k;i++){
leftRoate(nums);
}
}
void leftRoate(vector<int>&nums){
int temp = nums[nums.size() - 1];
for(int i = nums.size() - 1;i>=1; i--)
nums[i] = nums[i-1];
nums[0] = temp;
}
};