189.轮转数组
思路
先观察,如果k等于n,相等于啥都没做。所以先对k=k%n,得到真实的k
然后发现其实是索引-k到最后移动到前面,其余部分移动到后面,所以就有
nums[:] = nums[-k:]+nums[:-k]
这里的nums必须用切片形式,
nums[:] = … → 修改原数组的内容(in-place)。
nums = … → 改变了 nums 这个变量的指向,原数组没动。
这是野路子,正规做法是翻转法
翻转法
首先全部反转,然后根据k值,分别反转前后部分
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 % ndef reverse(i,j):while i < j:nums[i],nums[j] = nums[j],nums[i]i += 1j -= 1reverse(0,n-1)reverse(0,k-1)reverse(k,n-1)
复杂度
O(n)
数学原理
翻转有一个重要性质:
(AB)^R = B^R A^R
即:整体翻转等于子数组分别翻转后顺序交换。
这里的 ^R 表示翻转。
第一次整体翻转,把“相对顺序颠倒”
第二次翻转前半段,恢复 A 的顺序
第三次翻转后半段,恢复 B 的顺序