一. 题目
-
题目
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。 -
示例
二. 方法一
-
解题思路
- 将列表中最后的元素弹出并插入到列表的第一个位置
- 重复k次后, 得到的列表即为最终结果
-
解题代码
def rotate(self, nums: List[int], k: int) -> None: """ Do not return anything, modify nums in-place instead. """ for index in range(k): nums.insert(0, nums.pop())
-
分析
三. 方法二: 三次反转
-
解题思路
- 先将整个列表进行反转
- 然后再将列表中前k个元素进行反转
- 最后再将后面的元素进行反转
-
解题代码
def rotate(self, nums: List[int], k: int) -> None: """ Do not return anything, modify nums in-place instead. """ size = len(nums) # 如果没有这一步, 当k的值大于列表的长度时, 就会报错 # 通过取模, 可以把多余的操作省略掉 k = k % size def swap(arr, a, b): while a < b: temp = arr[a] arr[a] = arr[b] arr[b] = temp a, b = a + 1, b - 1 swap(nums, 0, size - 1) swap(nums, 0, k - 1) swap(nums, k, size - 1)
-
分析
时间复杂度: O(n)
空间复杂度: O(1)
四. 方法三: 拼接
- 解题思路
- 解题代码
def rotate(self, nums: List[int], k: int) -> None: """ Do not return anything, modify nums in-place instead. """ size = len(nums) k = k % size nums[:] = nums[size - k: size] + nums[:size - k]
- 分析
时间复杂度: O(n)
空间复杂度: O(1)