leetcode刷題--Rotate Array

黃思喆發表於2015-05-18

題目:將包含n個元素的陣列向右旋轉k步,最好空間複雜度為O(1)

例如,陣列[1,2,3,4,5,6,7]包含元素個數n = 7,向右旋轉k = 3步,得到[5,6,7,1,2,3,4]。

我是不理解啥叫旋轉了,不過可以用平移。

最簡單版本程式碼:

class Solution:
    # @param {integer[]} nums
    # @param {integer} k
    # @return {void} Do not return anything, modify nums in-place instead.
    def rotate(self, nums, k):
        n = len(nums)
        if k > 0 and n > 1:
            nums[:] = nums[n - k:] + nums[:n - k]

不過不滿足空間複雜度要求,因為開了新的空間存了個新list。

那怎麼改呢?

我們只有一個零時變數可用,要在原列表上得到新列表。

程式碼:

class Solution:
    # @param nums, a list of integer
    # @param k, num of steps
    # @return nothing, please modify the nums list in-place.
    def rotate(self, nums, k):
        n = len(nums)
        idx = 0
        distance = 0
        cur = nums[0]
        for x in range(n):
            next = (idx + k) % n
            temp = nums[next]
            nums[next] = cur
            idx = next
            cur = temp

            distance = (distance + k) % n
            if distance == 0:
                idx = (idx + 1) % n
                cur = nums[idx]

這段程式碼來自http://bookshadow.com/weblog/2015/02/24/leetcode-rotate-array/主要是不理解啥事旋轉,就google搜了下,於是就被劇透了。。。

相關文章