旋转数组
题目:给定一个数组,将数组中的元素向右移动 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]
解法:三次反转
对于[1,2,3,4,5,6,7]
根据k=k%n,将数组分为两段:
第一段,对应数组下标范围[0,n-k-1]段,即[1,2,3,4]
第二段,对应数组下标范围[n-k,n-1],即[5,6,7]
分为三步:
反转第一段,[4,3,2,1,5,6,7]
反转第二段,[4,3,2,1,7,6,5]
反转整体,[5,6,7,1,2,3,4]
完成!
复杂度分析
时间复杂度:O(n)
空间复杂度:O(1)
代码
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 % n
def swap( i, j):
while(i < j):
temp = nums[i]
nums[i] = nums[j]
nums[j] = temp
i += 1
j -= 1
swap(0, n-k-1)
swap(n-k, n-1)
swap(0, n-1)