菜菜的刷题日记 | 189. 轮转数组 rotate-array

请添加图片描述

系列索引:菜菜的刷题日记 | 被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.除自身以外数组的乘积

本人水平有限,文章中不足之处欢迎下方评论区批评指正~

如果感觉对你有帮助,点个赞 支持一下吧 ~

不定期分享 有趣、有料、有营养内容,欢迎 订阅关注 我的博客 ,期待在这与你相遇 ~

你可能感兴趣的:(#,LeetCode刷题日记,leetcode,python,算法,后端,数据结构)