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个元素,反转其余的,反转整个数组
"""