Python程式:查詢將所有球移動到當前位置所需的總距離列表


假設我們有一個名為 nums 的二進位制列表,其中只包含 0 和 1,其中 0 表示空單元格,1 表示單元格被球填充。我們必須找到一個新的列表,例如 L,其大小也與 nums 大小相同,其中 L[i] 設定為將所有球移動到 L[i] 所需的總距離。這裡,將球從索引 j 移動到索引 i 的距離是 |j - i|。

因此,如果輸入類似於 nums = [1, 1, 0, 1],則輸出將為 [4, 3, 4, 5],因為

  • L[0] = |0 - 0| + |1 - 0| + |3 - 0|
  • L[1] = |0 - 1| + |1 - 1| + |3 - 1|
  • L[2] = |0 - 2| + |1 - 2| + |3 - 2|
  • L[3] = |0 - 3| + |1 - 3| + |3 - 3|

因此,要將所有球移動到 L[1],我們必須將索引 0 處的球移動到 1,距離為 1,並將索引 3 處的球移動到 1,距離為 2。

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

  • 如果 nums 為空,則
    • 返回一個新列表
  • left_count := 0
  • right_count := 0
  • left_sum := 0
  • right_sum := 0
  • result := 一個新列表
  • 對於 nums 中的每個索引和值 num,執行以下操作:
    • 如果 num 非零,則
      • right_count := right_count + 1
      • right_sum := right_sum + index
  • 對於 nums 中的每個索引和值 num,執行以下操作:
    • 將 (left_sum + right_sum) 插入到 result 的末尾
    • 如果 num 非零,則
      • right_count := right_count - 1
      • left_count := left_count + 1
    • left_sum := left_sum + left_count
    • right_sum := right_sum - right_count
  • 返回 result

示例

讓我們看看以下實現以獲得更好的理解:

def solve(nums):
   if not nums:
      return []

   left_count = right_count = 0
   left_sum = right_sum = 0
   result = []

   for index, num in enumerate(nums):
      if num:
         right_count += 1
         right_sum += index

   for index, num in enumerate(nums):
      result.append(left_sum + right_sum)

      if num:
         right_count -= 1
         left_count += 1

      left_sum += left_count
      right_sum -= right_count

   return result

nums = [1, 1, 0, 1]
print(solve(nums))

輸入

[1, 1, 0, 1]

輸出

[4, 3, 4, 5]

更新於: 2021年10月16日

95 次瀏覽

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.