189. 旋转数组
原始题目链接:https://leetcode-cn.com/problems/rotate-array/
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
进阶:
尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗?
解题思路:
题目要求空间复杂度为 O(1) 的 原地
算法,所以不能申请额外的空间来帮助解决问题,需要数组内原地移动交换元素,所以一共需要3次翻转数组中的元素,已k为临界点,注意这里的k的值有可能超过数组的长度,所以需要对数组的长度求余,否则有的case通不过。翻转的操作如下图所示:
代码实现:
class Solution:
def rotate(self, nums: List[int], k: int) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
def swap(left, right):
while left < right:
nums[left], nums[right] = nums[right], nums[left]
left += 1
right -= 1
n = len(nums)
k = k % n
swap(0, n - k - 1)
swap(n - k, n - 1)
swap(0, n - 1)
参考文献:
https://leetcode-cn.com/problems/rotate-array/solution/san-ci-fan-zhuan-fu-yi-xie-pythonicde-jie-fa-pytho/