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]
使用 Python 的切片特性:
nums[-k:]
取末尾 k
个元素
nums[:-k]
取剩下前 n-k
个元素
将它们拼接后赋值回 nums[:]
实现原地修改
class Solution:
def rotate(self, nums: List[int], k: int) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
n = len(nums)
k = k % n # 处理 k 大于数组长度的情况
# 使用切片构造新顺序,并原地赋值回原数组
nums1 = nums[-k:] # 取最后 k 个元素
nums2 = nums[:-k] # 取前面 n-k 个元素
nums[:] = nums1 + nums2 # 原地修改数组
类型 | 复杂度 | 说明 |
---|---|---|
时间复杂度 | O(n) | 切片和拼接的时间为 O(n) |
空间复杂度 | O(n) | 使用了额外的两个数组副本 |
步骤:
整体反转:nums[::-1]
前 k
个反转
后 n-k
个反转
class Solution:
def rotate(self, nums: List[int], k: int) -> None:
n = len(nums)
k %= n
def reverse(left, right):
while left < right:
nums[left], nums[right] = nums[right], nums[left]
left += 1
right -= 1
reverse(0, n - 1)
reverse(0, k - 1)
reverse(k, n - 1)
时间复杂度: O(n)
空间复杂度: O(1)
本题考察的是数组旋转的不同实现方式。
Python 切片写法简洁易读,适合面试中快速实现。
喜欢这道题解的可以收藏+关注,持续更新更多算法与刷题技巧!