下面是Python3實現的旋轉數組的3種算法。
一、題目
給定一個數組,將數組中的元素向右移動k個位置,其中k是非負數。
例如:
輸入:[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]
說明:
1.盡可能想出更多的解決方案,至少有三種不同的方法可以解決這個問題。
2.要求使用空間復雜度為O(1)的原地算法。
二、解題算法
解法一
以倒數第k個值為分界線,把nums截成兩組再組合。因為k可能大于nums的長度(當這兩者相等的時候,就相當于nums沒有移動),所以我們取k%len(nums),k和nums的長度取余,就是最終我們需要移動的位置
代碼如下:
ifnums:
k=k%len(nums)
nums[:]=nums[-k:]+nums[:-k]
時間:64ms
假設:
nums=[1,2,3,4,5,6,7]
k=3
運行結果:
[5,6,7,1,2,3,4]
解法二
先把nums最后一位移動到第一位,然后刪除最后一位,循環k次。k=k%len(nums),取余
代碼如下:
ifnums:
k=k%len(nums)
whilek>0:
k-=1
nums.insert(0,nums[-1])
nums.pop()
時間:172ms
假設:
nums=[1,2,3,4,5,6,7]
k=3
運行結果:
[5,6,7,1,2,3,4]
解法三
先把nums復制到old_nums,然后nums中索引為x的元素移動k個位置后,當前索引為x+k,其值為old_nums[x]。,所以我們把x+k處理成(x+k)%len(nums),取余操作,減少重復的次數。
代碼如下:
ifnums:
old_nums=nums[:]
l=len(nums)
forxinrange(l):
nums[(x+k)%l]=old_nums[x]
時間:64ms
假設:
nums=[1,2,3,4,5,6,7]
k=3
運行結果:
[5,6,7,1,2,3,4]
以上內容為大家介紹了Python3實現旋轉數組的3種算法,希望對大家有所幫助,如果想要了解更多Python相關知識,請關注IT培訓機構:千鋒教育。http://www.dietsnews.net/