系列索引:菜菜的刷题日记 | 被LeetCode用Python狂虐的那段日子
菜鸡的刷题之路——2022/1/11
文章目录
- 【题目】
- 【官方思路】
- 【参考代码】
- 【我的代码】
- 【思考】
给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。
示例 1:
输入: nums = [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]
题目链接:https://leetcode-cn.com/problems/rotate-array/
方法一:使用额外的数组
我们可以使用额外的数组来将每个元素放至正确的位置。用 n 表示数组的长度,我们遍历原数组,将原数组下标为 i 的元素放至新数组下标为 (i+k) mod n 的位置,最后将新数组拷贝至原数组即可。
class Solution:
def rotate(self, nums: List[int], k: int) -> None:
num = [0 for i in range(len(nums))]
for i in range(len(nums)):
num[(i+k) % len(nums)] = nums[i]
nums[:] = num[:]
这里num之所以这么写是因为报错了,考虑到应该是数组长度的问题,所以在初始化时直接创建了一个指定长度的全0数组。
复杂度分析
时间复杂度:O(n),其中 nn 为数组的长度。每个元素只会被遍历一次。
空间复杂度:O(1)。我们只需常数空间存放若干变量。
方法二 看着有点麻烦就没仔细研究,直接看一三就足够了。
方法三:数组翻转
该方法基于如下的事实:当我们将数组的元素向右移动 k 次后,尾部 k mod n 个元素会移动至数组头部,其余元素向后移动 k mod n 个位置。
该方法为数组的翻转:我们可以先将所有元素翻转,这样尾部的 k mod n 个元素就被移至数组头部,然后我们再翻转 [0,k mod n − 1] 区间的元素和 [k mod n,n − 1] 区间的元素即能得到最后的答案。
代码见下方参考代码:
复杂度分析
时间复杂度:O(n),其中 n 为数组的长度。每个元素被翻转两次,一共 n 个元素,因此总时间复杂度为 O(2n)=O(n)。
空间复杂度:O(1)。
大佬的代码和官方给出的方法三一致,都是先拆分后翻转。
class Solution:
def rotate(self, nums: List[int], k: int) -> None:
n = len(nums)
k = k % n
self.reverse(nums, 0, n-1)
self.reverse(nums, 0, k-1)
self.reverse(nums, k, n-1)
def reverse(self, nums: List[int], left: int, right: int) -> None:
while left < right :
tmp = nums[left]
nums[left] = nums[right]
nums[right] = tmp
left += 1
right -= 1
我是菜鸡,写不对,555
看了官方题解以后照着c++代码用python复现了一下,如上。
Go !
Python力扣题解系列持续更新,欢迎
点赞收藏
+关注
上一篇:菜菜的刷题日记 | 485.最大连续1的个数 max-consecutive-ones
下一篇:菜菜的刷题日记 | 238.除自身以外数组的乘积
本人水平有限,文章中不足之处欢迎下方评论区批评指正~如果感觉对你有帮助,点个赞 支持一下吧 ~
不定期分享 有趣、有料、有营养内容,欢迎 订阅关注 我的博客 ,期待在这与你相遇 ~