题目:
给定一个数组,将数组中的元素向右移动 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) 的 原地 算法。
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/rotate-array/
解法一:
每次将整个数组向右一位,挪k次。空间复杂度O(1),时间复杂度O(nk)
class Solution:
def rotate(self, nums: List[int], k: int) -> None:
l = len(nums)
k = k%l
for i in range(k):
x = nums[-1]
nums[1:l] = nums[0:l-1]
nums[0] = x
解法二:
利用一个大小为k的数组X暂存正在被移动的数字。
依次遍历整个数组,把当前位置的数字添加进X,并且从X中输出当前位置应该赋予的值。
空间复杂度O(k),时间复杂度O(n+k)
class Solution:
def rotate(self, nums: List[int], k: int) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
l = len(nums)
k = k%l
x = []
for i in range(l):
x.append(nums[i])
if len(x)>k:
nums[i] = x[0]
del x[0]
i = 0
while(x):
nums[i] = x[0]
del x[0]
i+=1
解法三:
跳着遍历整个数组,每次挪移k个数字。
空间复杂度O(2k),时间复杂度O(n//k+1)
class Solution:
def rotate(self, nums: List[int], k: int) -> None:
l = len(nums)
k = k%l
index1 = 0
index2 = k
if k>0:
a = nums[-k:-1]
a.append(nums[-1])
while(index1<=l-1):
if(index2 > l-1):
index2 = l
nums[index1:index2] = a[0:(index2-index1)]
else:
b = nums[index1:index2]
nums[index1:index2] = a
a = b
index1 = index2
index2 = index2+k