369 字
2 分钟
189. 轮转数组
189. 轮转数组
给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。
示例 1:
输入: nums = [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:
输入:nums = [-1,-100,3,99], k = 2输出:[3,99,-1,-100]解释:向右轮转 1 步: [99,-1,-100,3]向右轮转 2 步: [3,99,-1,-100]
题解
先对轮转步数k
求余。real_step = k % nums.size()
,防止k大于数组长度nums.size()
额外数组,暴力
- 创建一个长度为
real_step
的数组存储后面的元素。拷贝。 - 将前面的元素移动
real_step
步,到数组末尾。 - 将临时数组中的元素,拷贝回去。
class Solution {public: void rotate(vector<int>& nums, int k) { int n = nums.size(); int real_step = k % n; vector<int> tmp_vec(real_step); // 拷贝后面元素 for(int i = 0; i < real_step; i++){ tmp_vec[i] = nums[n - real_step + i]; }
// 移动数组 for(int i = n - real_step - 1; i >= 0; i--){ nums[i + real_step] = nums[i]; }
// 放到前面 for(int i = 0; i < real_step; i++){ nums[i] = tmp_vec[i]; } }};
环状数组
- 将数组拷贝一份拼在当前数组的末尾。再形式上首尾相连。
- 从第
nums.size() - real_step
的位置开始遍历,遍历nums.size()
长度。 - 将遍历的元素拷贝到新数组,新数组就是结果。
2次翻转
- 先将原始数组翻转
- 分别将前
real_step
个元素的子数组以及后面一部分,各自翻转。