Skip to content

189. 轮转数组 ​

  • 题号:189
  • 来源:LeetCode
  • 难度:中等
  • 标签:数组 原地算法
  • 语言:Python
  • 解法:1 个
  • 作者:lmliheng
  • 最近更新:2026-09-29

Python · O(n) 时间 · O(1) 空间 · 更新于 2026-09-29

三次翻转:整体 → 前 k 个 → 后 n-k 个;下面还有一版 pop/insert 会超时

python
"""
@lc 189
@title 轮转数组
@difficulty medium
@tags 数组,原地算法
@time O(n)
@space O(1)
@note 三次翻转:整体 → 前 k 个 → 后 n-k 个;下面还有一版 pop/insert 会超时
"""
## 超时解法:使用pop弹出右移元素 再insert到nums

class Solution1:
    def rotate(self, nums: list[int], k: int) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        n=len(nums)
        k=k%n
        arr=[]
        for i in range(n-k,n):
            arr.append(nums.pop())
        for i in range(0,k):
            nums.insert(0,arr[i])


## 反转法
# 比如[1,2,3,4,5,6],k=10,实际上转k%=6,k=4
# 整体反转[6,5,4,3,2,1]
# 反转前k个,[3,4,5,6,2,1]
# 反转后len-k个,[3,4,5,6,1,2]得到结果

class Solution2:
    def rotate(self, nums: list[int], k: int) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        # self.nums = nums
        n = len(nums)
        k %= n
        self.reverse(nums, 0, n - 1)
        self.reverse(nums, 0, k - 1)
        self.reverse(nums, k, n - 1)

    def reverse(self, nums, start, end):
        while start < end:
            temp = nums[start]
            nums[start] = nums[end]
            nums[end] = temp
            start += 1
            end -= 1

源码:python/leetcode/hot100/15.py


在 GitHub 上查看题目所在目录:lmliheng/algorithm