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