Python程式:查詢將所有球移動到每個盒子的最小操作次數


假設我們有一個名為 boxes 的二進位制字串,其中 boxes[i] 為 '0' 表示第 i 個盒子為空,'1' 表示它包含一個球。現在,在一個操作中,我們可以將一個球從一個盒子移動到相鄰的盒子。這樣做之後,某些盒子中可能有多個球。我們必須找到一個大小為 n 的陣列 answer,其中 answer[i] 是將所有球移動到第 i 個盒子的最小操作次數。

因此,如果輸入類似於 boxes = "1101",則輸出將為 [4, 3, 4, 5]

  • 要將所有球放在第一個盒子上,我們必須從 box2 中取一個球,需要一次操作,從最後一個球取,需要三次操作,所以總共 4 次操作。

  • 要將所有球放在第二個盒子上,我們必須從 box1 中取一個球,需要一次操作,從最後一個球取,需要兩次操作,所以總共 3 次操作。

  • 要將所有球放在第三個盒子上,我們必須從 box2 和最後一個盒子分別取一個球,各需要一次操作,從 box1 取,需要兩次操作,所以總共 4 次操作。

  • 要將所有球放在最後一個盒子上,我們必須從 box1 取,需要三次操作,從 box2 取,需要兩次操作,所以總共 5 次操作。

為了解決這個問題,我們將遵循以下步驟:

  • left := 0,right := 0,dist := 0

  • 對於範圍從 0 到 boxes 大小 - 1 的 i,執行以下操作:

    • 如果 boxes[i] 與 "1" 相同,則:

      • dist := dist + i

      • 如果 i 與 0 相同,則:

        • left := left + 1

      • 否則:

        • right := right + 1

  • arr := 一個列表,最初將 dist 放入其中

  • 對於範圍從 1 到 boxes 大小 - 1 的 i,執行以下操作:

    • 在 arr 的末尾插入 arr[i-1] + left - right

    • 如果 boxes[i] 與 "1" 相同,則:

      • left := left + 1

      • right := right - 1

  • 返回 arr

示例

讓我們看看下面的實現,以便更好地理解:

def solve(boxes):
   left = 0
   right = 0

   dist = 0
   for i in range(len(boxes)):
      if boxes[i] == "1":
         dist += i
         if i == 0:
            left += 1
         else:
            right += 1
   arr = [dist]
   for i in range(1, len(boxes)):
      arr.append(arr[i-1] + left - right)
      if boxes[i] == "1":
         left += 1
         right -= 1
   return arr

boxes = "1101"
print(solve(boxes))

輸入

"1101"

輸出

[4, 3, 4, 5]

更新於: 2021年10月6日

660 次檢視

開啟你的職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.