數軸上放置了一些籌碼,每個籌碼的位置存在數組 chips 當中。
你可以對 任何籌碼 執行下面兩種操作之一(不限操作次數,0 次也可以):
- 將第 i 個籌碼向左或者右移動 2 個單位,代價爲 0。
- 將第 i 個籌碼向左或者右移動 1 個單位,代價爲 1。
最開始的時候,同一位置上也可能放着兩個或者更多的籌碼。
返回將所有籌碼移動到同一位置(任意位置)上所需要的最小代價。
示例 1:
輸入:chips = [1,2,3]
輸出:1
解釋:第二個籌碼移動到位置三的代價是 1,第一個籌碼移動到位置三的代價是 0,總代價爲 1。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/play-with-chips
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
————————————
解題思路:題目給定數組chips,chips中的元素代表每個籌碼的座標,所以如果chips中的某些元素值相同,則表示兩個籌碼在同一位置。
因爲距離爲偶數的兩個籌碼移動到同一位置時代價爲0,所以chips中所有座標值爲偶數的籌碼移動到同一個位置的代價爲0,chips中所有座標值爲奇數的籌碼移動到同一位置的代價爲0。
這樣在代價爲0的情況下得到兩組籌碼,假設座標爲偶數的籌碼個數爲n,座標爲奇數的籌碼個數爲m。
一個座標爲奇數的籌碼移動到座標爲偶數的位置的代價始終爲1,因爲奇數和偶數的差值爲奇數,奇數值爲偶數+1,因此代價始終爲1。
所以只需要返回n和m的較小值就可以得到最終的答案。
這裏給的標籤是貪心,沒理解貪心具體應用在哪裏,太菜了。
其Python代碼如下:
class Solution:
def minCostToMoveChips(self, chips: List[int]) -> int:
odd = 0 # 存儲座標爲奇數的籌碼個數
even = 0 # 存儲座標爲偶數的籌碼個數
for chip in chips: # 遍歷數組,統計奇偶座標籌碼
if chip%2 == 0:
even += 1
else:
odd += 1
return min(odd,even) # 返回兩者中的較小值
代碼比較簡單,時間複雜度爲O(n),空間複雜度爲O(1)。