题目
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
示例 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]
示例 2:
输入: [-1,-100,3,99] 和 k = 2
输出: [3,99,-1,-100]
解释:
向右旋转 1 步: [99,-1,-100,3]
向右旋转 2 步: [3,99,-1,-100]
说明:
尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
要求使用空间复杂度为 O(1) 的 原地 算法。
答案
解法一
- 旋转长度,通过取余避免重复操作
- 从尾部向前开始替换,直接替换为最终值,记录尾部初始值,给数组头部使用
- ranges通过第三个参数设为-1实现逆序
注意:第二个参数要取-1才能遍历完一次数组
class Solution(object):
def rotate(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: None Do not return anything, modify nums in-place instead.
"""
nums_len = len(nums)
circle_time = k % nums_len
if circle_time == 0:
return nums
heads = nums[nums_len - circle_time:]
for i in range(nums_len - 1, -1, -1):
new_index = i - circle_time
if new_index >=0:
nums[i] = nums[new_index]
else:
nums[i] = heads[new_index]
解法二
nums[:]为何写成nums就不行?
应该是不用切片就没有修改原nums地址的值
class Solution(object):
def rotate(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: None Do not return anything, modify nums in-place instead.
"""
nums_len = len(nums)
nums[:] = nums[nums_len-k:] + nums[:nums_len-k]