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()

额外数组,暴力#

  1. 创建一个长度为real_step的数组存储后面的元素。拷贝。
  2. 将前面的元素移动real_step步,到数组末尾。
  3. 将临时数组中的元素,拷贝回去。
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];
}
}
};

环状数组#

  1. 将数组拷贝一份拼在当前数组的末尾。再形式上首尾相连。
  2. 从第nums.size() - real_step的位置开始遍历,遍历nums.size()长度。
  3. 将遍历的元素拷贝到新数组,新数组就是结果。

2次翻转#

  1. 先将原始数组翻转
  2. 分别将前real_step个元素的子数组以及后面一部分,各自翻转。
189. 轮转数组
https://chrisnake11.github.io/blog/posts/coding/leecode/189-轮转数组/
作者
Zheyv
发布于
2025-07-22
许可协议
CC BY-NC-SA 4.0