問題是來自代碼鬥爭,其中指出:無限數量的框排列在一行中並從左到右編號。左邊的第一個盒子是 第一個,下一個盒子是第二個,等等。n個球放在n個盒子中,每個盒子只能有一個球。 你想組織球,所以你決定把所有的球排列在一起。他們應該佔用連續的一組盒子 。您可以一球拿下一個球並將其移入空盒子中。什麼是更快的算法來重新排列給定的數組數組
給定一個指示放置球的盒子數量的數組球,找到組織球所需的最小數量的移動。
例
對於滾珠= [6,4,1,7,10],輸出應該是 ballsRearranging(滾珠)= 2
在這個例子中,移動的所需的最小數將球彼此相鄰排列爲2.您可以將球1中的 球移動到方塊5,方塊10中的球移動到方塊8(或方框3)。
目前我的代碼是:
def ballsRearranging(balls):
ballsLength = len(balls)
partial = ballsLength//2 #INITIALLY SET TO HALF
setBalls = set(balls)
sortedBalls = sorted(balls)
minimum = 1000000
#####CHECK IF ITS ALREADY ORGANIZED
#####FIRST NUM PLUS LENGTH - 1 IS EQUAL TO THE LAST NUM
if sortedBalls[0]+ballsLength-1 == sortedBalls[-1]:
return 0
for i,num in enumerate(sortedBalls):
#####NO NEED TO GO PASS HALF WAY SINCE THAT AUTOMATICALLY MEANS HALF WILL BE OUT OF RANGE
#####THIS VALUE DYNAMICALLY CHANGES TO THE SMALLEST FRACTION OF OUT OF RANGE FOUND
if i >= partial:
break
#####IF WE TAKE THIS NUM AS THE BEGINNING, ORDERED BALLS WILL GO UP TO THE RANGE RNG
rng = range(num,num+ballsLength)
#####BALLS ALREADY IN THE RANGE RNG, WE WONT BE MOVING THESE BALLS
inRange = setBalls & set(rng)
#####BALLS NOT IN RANGE, EACH WILL BE REQUIRED TO MOVE
#####THE LENGTH OF THIS WILL BE THE NUMBER OF MOVES REQUIRED
outRange = setBalls - set(rng)
lenOutRange = len(outRange)
if lenOutRange < minimum:
minimum = lenOutRange
partial = 100*(lenOutRange/ballsLength) #UPDATE THE PARTIAL VALUE
這工作得很好,但目前超時與隱藏的測試4S的時間限制。基本上我的算法從最小的數字到給定數組的特定部分(分數)。它檢查原始集合與給定範圍相交的位置。無論哪一個超出範圍項目的數量最少,都將成爲最低數量的更改/重新安排。想知道最好的算法是什麼,最好在python中。
什麼是這個當前算法大O複雜的代碼? – Bobby
我建議你把它移到CodeReview.StackExchange.com; StackOverflow通常用於非工作代碼。 – Prune
欲獲得此處的幫助,請發佈長期運行的測試用例的驅動代碼。 – Prune