LeetCode 189. 轮转数组

题目描述

189. 轮转数组

image-20220920091450540

思路分析

解法一:三次翻转(推荐)

核心思路

  • 先整体翻转数组,再分别翻转前 k 个元素与后 n-k 个元素。
  • 这样等价于把后段移动到前面,且保持相对顺序。
  • 需对 k 取模处理,避免越界。


复杂度分析

  • 时间复杂度:O(n),其中 n 为数组长度。
  • 空间复杂度:O(1),原地翻转。
class Solution {
    public void rotate(int[] nums, int k) {
        int n = nums.length;
        k %= n;

        // 三次翻转完成轮转
        reverse(nums, 0, n - 1);
        reverse(nums, 0, k - 1);
        reverse(nums, k, n - 1);
    }

    private void reverse(int[] nums, int l, int r) {
        while (l < r) {
            int tmp = nums[l];
            nums[l] = nums[r];
            nums[r] = tmp;
            l++;
            r--;
        }
    }
}
func rotate(nums []int, k int) {
    n := len(nums)
    k %= n

    // 三次翻转完成轮转
    reverse(nums, 0, n-1)
    reverse(nums, 0, k-1)
    reverse(nums, k, n-1)
}

func reverse(nums []int, l, r int) {
    for l < r {
        nums[l], nums[r] = nums[r], nums[l]
        l++
        r--
    }
}

相似题目

题目 难度 考察点
151. 反转字符串中的单词 中等 翻转技巧
541. 反转字符串 II 简单 双指针
61. 旋转链表 中等 链表操作
396. 旋转函数 中等 数学推导
48. 旋转图像 中等 原地变换
本文作者:
本文链接: https://hgnulb.github.io/blog/2025/66202924
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!