码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode Rotate Array

时间:2016-06-12 03:26:51      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:

LeetCode解题之Rotate Array


原题

将一个数组中的数字右旋k位,即所有的数字向后移k位,末尾的数字移到开头。

注意点:

  • 使用尽可能多的方法来解决
  • 提供一种只需要O(1)空间的解法

例子:

输入: nums = [1, 2, 3, 4, 5, 6, 7], k = 3

输出: [5, 6, 7, 1, 2, 3, 4]

解题思路

解法一,记下最后一个数字,其他的数字向后移一位,最后把记下的数字放在开头,如此进行k次。这个解法空间复杂度为O(1),时间复杂度O(kn)。

解法二,申请一个等大的数组,将移位后的结果存在新申请的数组中。这个解法空间复杂度为O(n),时间复杂度为O(n)。

解法三,右旋k个数字有个等价操作,就是将前k个数字翻转,将剩下的数字也翻转,最后将整个数组翻转。此时数组与右旋k个数字的结果相同。这个解法空间复杂度为O(1),时间复杂度为O(n)。

注意,k可能比数组的长度n还大,我们可以将k对n取余数,因为右旋n个数字相当于没有变化,可以减少计算量。

AC源码

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

        def reverse(nums, start, end):
            while start < end:
                nums[start], nums[end] = nums[end], nums[start]
                start += 1
                end -= 1

        n = len(nums)
        k %= n
        reverse(nums, 0, n - k - 1)
        reverse(nums, n - k, n - 1)
        reverse(nums, 0, n - 1)


if __name__ == "__main__":
    nums = [1, 2, 3, 4, 5, 6, 7]
    Solution().rotate(nums, 10)
    assert nums == [5, 6, 7, 1, 2, 3, 4]

欢迎查看我的Github (https://github.com/gavinfish/LeetCode-Python) 来获得相关源码。

LeetCode Rotate Array

标签:

原文地址:http://blog.csdn.net/u013291394/article/details/51598435

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!