原题目:
给定一个数组,将数组中的元素向右移动 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,-1添加链接描述00,3]
向右旋转 2 步: [3,99,-1,-100]
思路:
用reverse函数进行数组元素的翻转,reverse函数主要的功能是将数组元素在指定的范围从后往前进行翻转,具体可以参考
C++ reverse函数的用法
之前的思路是用insert函数和pop函数组合进行翻转,但是运行时间超时,所以不能使用这个方法,关于insert函数和pop函数的使用可以参考
vector insert用法 C++
pop函数的使用
代码(之前想的)
class Solution {
public:
void rotate(vector<int>& nums, int k) {
vector<int>::iterator it;
it=nums.begin();
for(int i=0;i<k;i++)
{
nums.insert(it,nums[nums.size()-1]);
it=nums.begin();
nums.pop_back();
}
}
};
代码2
class Solution {
public:
void rotate(vector<int>& nums, int k) {
// 三次翻转搞定
k = k % nums.size();
reverse(nums.begin(), nums.begin() + nums.size() - k);//翻转k前面元素
reverse(nums.begin() + nums.size() - k, nums.end());//翻转k后面元素
reverse(nums.begin(), nums.end());//从后往前翻转
}
};
上面代码的运行逻辑:
如1,2,3,4,5,6,7
第一步
4,3,2,1,5,6,7
第二步
4,3,2,1,7,6,5
第三步
5,6,7,1,2,3,4