前往
大廳
主題

LeetCode - 2335. Minimum Amount of Time to Fill Cups 解題心得

Not In My Back Yard | 2023-06-05 12:00:11 | 巴幣 110 | 人氣 164

題目連結:


題目意譯:
你有一個飲水機,其可以送出冷、溫以及熱水。每秒,你可以裝滿兩杯不同溫度的水,或是一杯任一溫度的水。

你被給定一個索引值從 0 開始且長度為 3 的的整數陣列 amount,其中 amount[0] 、 amount[1] 和 amount[2] 依序代表著你需要裝滿的冷、溫以及熱水杯子。回傳裝滿所有杯子最少所需的秒數。

限制:
amount.length == 3
0 ≦ amount[i] ≦ 100



範例測資:
範例 1:
輸入: amount = [1,4,2]
輸出: 4
解釋: 裝滿所有杯子的其中一個方式為:
第 1 秒:裝滿一個冷水杯和一個溫水杯。
第 2 秒:裝滿一個溫水杯和一個熱水杯。
第 3 秒:裝滿一個溫水杯和一個熱水杯。
第 4 秒:裝滿一個溫水杯。
可以證明 4 秒即為最少所需秒數。

範例 2:
輸入: amount = [5,4,4]
輸出: 7
解釋: 裝滿所有杯子的其中一個方式為:
第 1 秒:裝滿一個冷水杯和一個熱水杯。
第 2 秒:裝滿一個冷水杯和一個溫水杯。
第 3 秒:裝滿一個冷水杯和一個溫水杯。
第 4 秒:裝滿一個溫水杯和一個熱水杯。
第 5 秒:裝滿一個冷水杯和一個熱水杯。
第 6 秒:裝滿一個冷水杯和一個溫水杯。
第 7 秒:裝滿一個熱水杯。

範例 3:
輸入: amount = [5,0,0]
輸出: 5
解釋: 每一秒,我們都裝滿一杯冷水杯。


解題思維:
無視水的種類,先按照所需數量由小排到大。假設排序後所需數量為 a 、 b 、 c(a ≦ b ≦ c),並稱呼它們對應的水種類分別為 x 、 y 、 z。

可以看到如果 a + b < c 時,則我們只需要每次操作固定裝 z,然後看 x 或 y 還有沒有需要裝,有需要就隨便拿一種來裝。因此最少操作數為 c 次(因為 x 和 y 消耗完後,一次只能裝一杯 z,所以總體次數被 c 所決定)。

而當 a + b = c 時,則就跟上面的策略很像,而且會分得剛剛好。不過最少操作數依舊是 c 次。

而當 a + b > c 時,同樣也是按照類似上面的策略,不過這次 z 這種水會先被裝完。因此會剩下 x 和 y 兩種,而剩餘數量為 a + b - c。而雖然操作有兩種,但是我們應盡量使用第一種可以裝兩種水的操作,因此過程中應盡量保持 x 、 y 的數量是差不多的(最多差 1)。因此總操作數為 (a + b + c) ÷ 2 向上取整。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作