LeetCode使用Python實現旋轉陣列
阿新 • • 發佈:2018-12-16
需求:
給定一個數組,將陣列中的元素向右移動 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) 的原地演算法。
廢話少說直接上程式碼:
class Solution: def rotate(self, nums, k): """ :type nums: List[int] :type k: int :rtype: void Do not return anything, modify nums in-place instead. """ # 法一: # l = len(nums) # k = k % l # nums[:] = nums[l-k:] + nums[:l-k] # 法二: # l = len(nums) # k = k % l # nums[:l-k] = reversed(nums[:l-k]) # nums[l-k:] = reversed(nums[l-k:]) # nums[:] = reversed(nums) # 法三: def rev(start, end, nums): while start < end: nums[start], nums[end] = nums[end], nums[start] start += 1 end -= 1 l = len(nums) k = k % l rev(0, l-k-1, nums) rev(l-k, l-1, nums) rev(0, l-1, nums)
總結:
第一種方法是直接將原陣列做切片處理,然後原地拼接。
第二種方法是使用Python內建函式reversed將陣列進行反轉,根據旋轉陣列的特點,我們可以事先對元素組的切片部分分別進行反轉,最後對整個陣列進行反轉,即可達到翻轉的效果。
第三種方法實際上與第二種方法異曲同工,第二種方法的Python內建函式reversed有返回值,並不是在原陣列上進行操作,在第三種方法中,我們自己實現了反轉功能的函式rev,這樣我們可以直接原地進行陣列的反轉。