leetcode 189.旋转数组

176 阅读1分钟

189.旋转数组

给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。

至少有三种不同的方法,用空间复杂度为 O(1) 的 原地 算法

输入: [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]
class Solution:
    def rotate(self, nums: List[int], k: int) -> None:
        n = len(nums)
        k = k % n
        nums[:] = nums[n-k:] + nums[:n-k]
"""
旋转数组k次, k%n 个尾部元素会被移动到头部,剩下的元素会被向后移动。

nums[:] = nums[n-k:] + nums[:n-k] 
不能!!写成:
nums = nums[n-k:] + nums[:n-k]
前面的能原地改变nums的值,但后面的指向了新的nums,不是O(1)空间
"""


class Solution(object):
    def rotate(self, nums, k):
        if k is None or k <= 0:
            return
        k, end = k % len(nums), len(nums) - 1
        self.reverse(nums, 0, end - k)
        self.reverse(nums, end - k + 1, end)
        self.reverse(nums, 0, end)

    def reverse(self, nums, start, end):
        while start < end:
            nums[start], nums[end] = nums[end], nums[start]
            start, end = start + 1, end - 1
"""
经典的三步数组旋转:
反转前n - k个元素,反转其余的,反转整个数组
"""