LeetCode 189. 轮转数组(Rotate Array)

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] 

解题思路:切片法(Pythonic 简洁写法)

核心思想:

使用 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) 使用了额外的两个数组副本

补充其他常见解法

✅方法 2:原地反转(空间优化至 O(1))

步骤:

  1. 整体反转:nums[::-1]

  2. k 个反转

  3. 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 切片写法简洁易读,适合面试中快速实现。

喜欢这道题解的可以收藏+关注,持续更新更多算法与刷题技巧!  

你可能感兴趣的:(leetcode,算法,职场和发展)