【力扣】旋转数组
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/rotate-array
给定一个数组,将数组中的元素向右移动 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]
说明:
- 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
- 要求使用空间复杂度为 O(1) 的 原地 算法。
还没想到好方法,先用O(n)空间复杂度写下:
1 class Solution: 2 def rotate(self, nums: List[int], k: int) -> None: 3 """ 4 Do not return anything, modify nums in-place instead. 5 """ 6 a = [] 7 for i in range(len(nums)): 8 a[(i+k)%len(nums)] = nums[i]
显然是不满足题意的,而且这题解法很多我却没有思路。
挪几次就用几次循环,每个循环里都把最后一个数加到数组最前面,然后删掉最后一个:
1 class Solution: 2 def rotate(self, nums, k): 3 for i in range(k): 4 nums.insert(0, nums[-1]) 5 nums.pop() 6 7 作者:wonder-hyc 8 链接:https://leetcode-cn.com/problems/rotate-array/solution/gan-jue-zhe-shi-zui-zhi-jie-de-fang-fa-liao-ba-by-/ 9 来源:力扣(LeetCode)
三次反转
对于[1,2,3,4,5,6,7],
反转k个元素,$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)
作者:wu_yan_zu
链接:https://leetcode-cn.com/problems/rotate-array/solution/san-ci-fan-zhuan-fu-yi-xie-pythonicde-jie-fa-pytho/
1 class Solution: 2 def rotate(self, nums: List[int], k: int) -> None: 3 """ 4 Do not return anything, modify nums in-place instead. 5 """ 6 n=len(nums) 7 k=k%n 8 def swap(l,r): 9 while(l<r): 10 nums[l],nums[r]=nums[r],nums[l] 11 l=l+1 12 r=r-1 13 swap(0,n-k-1) 14 swap(n-k,n-1) 15 swap(0,n-1) 16 17 作者:wu_yan_zu 18 链接:https://leetcode-cn.com/problems/rotate-array/solution/san-ci-fan-zhuan-fu-yi-xie-pythonicde-jie-fa-pytho/ 19 来源:力扣(LeetCode)
借助切片完成反转:
1 class Solution: 2 def rotate(self, nums: List[int], k: int) -> None: 3 """ 4 Do not return anything, modify nums in-place instead. 5 """ 6 n = len(nums) 7 k %= n 8 nums[:] = nums[::-1] 9 nums[:k] = nums[:k][::-1] 10 nums[k:] = nums[k:][::-1] 11 12 作者:wu_yan_zu 13 链接:https://leetcode-cn.com/problems/rotate-array/solution/san-ci-fan-zhuan-fu-yi-xie-pythonicde-jie-fa-pytho/ 14 来源:力扣(LeetCode)
切片实际上也开辟新空间了。