Harukaze

 

【力扣】旋转数组

来源:力扣(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)

切片实际上也开辟新空间了。

 

posted on 2021-01-08 11:03  Harukaze  阅读(89)  评论(0)    收藏  举报

导航