1. 程式人生 > >LeetCode使用Python實現旋轉陣列

LeetCode使用Python實現旋轉陣列

需求:

給定一個數組,將陣列中的元素向右移動 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,這樣我們可以直接原地進行陣列的反轉。