LC 189数组与双指针中等第 4 / 95 题

轮转数组

Rotate Array

数组翻转数学
本机进度仅保存在当前浏览器

题目描述

给定一个整数数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。要求使用空间复杂度 O(1) 的原地算法。

示例:nums = [1, 2, 3, 4, 5, 6, 7],k = 3,输出 [5, 6, 7, 1, 2, 3, 4]。

解题思路

  1. 观察结果结构:右旋 k 位后,数组由「后 k 个元素 + 前 n-k 个元素」拼接而成。
  2. 三次翻转技巧:先整体翻转,再分别翻转前 k 个与后 n-k 个元素,即得结果。
  3. 注意 k 可能大于数组长度,实际位移为 k mod n。
  4. 三次翻转共移动每个元素常数次,比循环移位的 O(n·k) 高效得多。

参考实现

查看参考实现Python · 建议先自行作答
def rotate(nums, k):
    def reverse(l, r):
        # 双指针原地翻转闭区间 [l, r]
        while l < r:
            nums[l], nums[r] = nums[r], nums[l]
            l += 1
            r -= 1

    n = len(nums)
    k %= n
    reverse(0, n - 1)
    reverse(0, k - 1)
    reverse(k, n - 1)

复杂度与归属

时间复杂度O(n)
空间复杂度O(1)
所属分类数组与双指针
题源LeetCode 189

关联教程

返回题图鉴