189. 旋转数组(Python)

作者: 玖月晴 | 来源:发表于2019-05-13 11:29 被阅读0次

题目

难度:★☆☆☆☆
类型:数组

给定一个数组,将数组中的元素向右移动 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]

示例 2:

输入: [-1,-100,3,99] 和 k = 2
输出: [3,99,-1,-100]
解释:
向右旋转 1 步: [99,-1,-100,3]
向右旋转 2 步: [3,99,-1,-100]

说明:

尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
要求使用空间复杂度为 O(1) 的原地算法。

解答

方案1:一步一步旋转

我们定义了一个函数rotate_1_step(),实现旋转一步的功能,然后使用循环执行多次列表旋转,这种方法在列表中元素数量较少时行之有效,但是元素数量很大时会很慢。

class Solution(object):
    def rotate(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: None Do not return anything, modify nums in-place instead.
        """
        def rotate_1_step(nums):
            """
            实现旋转一步的功能
            :param nums:
            :return:
            """
            tmp = nums[-1]
            for i in range(len(nums)-1, 0, -1):
                nums[i] = nums[i-1]
            nums[0] = tmp

        for _ in range(k):
            rotate_1_step(nums)

力扣提交果然超时。

方案2:列表连接

这个方法十分简单,直接用将列表的两个部分进行间接即可,但是空间复杂度较大。这里需要注意k的取值可能大于列表长度,需要进行取余处理。

class Solution(object):
    def rotate(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: None Do not return anything, modify nums in-place instead.
        """
        k = k%len(nums)        # 有必要计算一下如果旋转步长超过一圈的情况
        nums[:] = nums[-k:]+nums[:-k]

方案3:使用队列

把列表看成队列,每一步旋转可以看做弹出列表最后一个元素并加入到列表首端,同样的操作执行k次。

class Solution(object):
    def rotate(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: None Do not return anything, modify nums in-place instead.
        """
        for _ in range(k):
            nums.insert(0, nums.pop())

方案4:双重逆序

将整个列表逆序,并将列表两部分内容再次通过逆序方式返回原顺序。

class Solution(object):
    def rotate(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: None Do not return anything, modify nums in-place instead.
        """
        k = k % len(nums)
        nums[:] = reversed(nums)
        nums[:k] = reversed(nums[:k])
        nums[k:] = reversed(nums[k:])

如有疑问或建议,欢迎评论区留言~

相关文章

  • LeetCodeDay02

    189. 旋转数组 描述 将包含 n 个元素的数组向右旋转 k 步。 例如,如果 n = 7 , k = 3,...

  • 189. 旋转数组

    189. 旋转数组[https://leetcode-cn.com/problems/rotate-array/]...

  • 算法:旋转数组

    189. 旋转数组[https://leetcode-cn.com/problems/rotate-array/]...

  • 189. 旋转数组(Python)

    题目 难度:★☆☆☆☆类型:数组 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。 示例 示...

  • 189. 旋转数组

    内容 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。 示例 1: 输入: [1,2,3,4...

  • 189. 旋转数组

    将包含n个元素的数组向右旋转k步。 例如,如果n= 7 ,k= 3,给定数组[1,2,3,4,5,6,7],向右旋...

  • 189. 旋转数组

    文|Seraph 1 问题 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。不要使用额外的数...

  • 189. 旋转数组

    给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。 示例 1: 输入: [1,2,3,4,5,...

  • 189. 旋转数组

    题目描述 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。 示例 1: 示例 2: 说明: ...

  • 189. 旋转数组

网友评论

    本文标题:189. 旋转数组(Python)

    本文链接:https://www.haomeiwen.com/subject/gyqlaqtx.html