Welcome to Subscribe On Youtube
2335. Minimum Amount of Time to Fill Cups
Description
You have a water dispenser that can dispense cold, warm, and hot water. Every second, you can either fill up 2 cups with different types of water, or 1 cup of any type of water.
You are given a 0-indexed integer array amount of length 3 where amount[0], amount[1], and amount[2] denote the number of cold, warm, and hot water cups you need to fill respectively. Return the minimum number of seconds needed to fill up all the cups.
Example 1:
Input: amount = [1,4,2] Output: 4 Explanation: One way to fill up the cups is: Second 1: Fill up a cold cup and a warm cup. Second 2: Fill up a warm cup and a hot cup. Second 3: Fill up a warm cup and a hot cup. Second 4: Fill up a warm cup. It can be proven that 4 is the minimum number of seconds needed.
Example 2:
Input: amount = [5,4,4] Output: 7 Explanation: One way to fill up the cups is: Second 1: Fill up a cold cup, and a hot cup. Second 2: Fill up a cold cup, and a warm cup. Second 3: Fill up a cold cup, and a warm cup. Second 4: Fill up a warm cup, and a hot cup. Second 5: Fill up a cold cup, and a hot cup. Second 6: Fill up a cold cup, and a warm cup. Second 7: Fill up a hot cup.
Example 3:
Input: amount = [5,0,0] Output: 5 Explanation: Every second, we fill up a cold cup.
Constraints:
amount.length == 30 <= amount[i] <= 100
Solutions
Solution 1: Sorting
We can greedily select the larger two numbers each time to subtract one (up to $0$) until all numbers become $0$.
Time complexity $O(S)$, space complexity $O(1)$. Among them, $S$ is the sum of all numbers in the array amount, in this question $S \leq 300$.
Solution 2
We can sort the array amount. Let $a$, $b$, and $c$ be the three numbers in the array amount respectively. There are two situations:
- If $a + b \leq c$, then we only need $c$ operations to turn everything into $0$, so the answer is $c$.
- If $a + b > c$, each time we subtract two of the numbers by one, we end up matching, or are left with the last number (depending on whether the sum is even or odd), so the answer is $\left \lfloor \frac{a + b + c + 1}{2} \right \rfloor$.
Time complexity $O(1)$, space complexity $O(1)$.
-
class Solution { public int fillCups(int[] amount) { int ans = 0; while (amount[0] + amount[1] + amount[2] > 0) { Arrays.sort(amount); ++ans; amount[2]--; amount[1] = Math.max(0, amount[1] - 1); } return ans; } } // Solution 2 class Solution { public int fillCups(int[] amount) { Arrays.sort(amount); if (amount[0] + amount[1] <= amount[2]) { return amount[2]; } return (amount[0] + amount[1] + amount[2] + 1) / 2; } } -
class Solution { public: int fillCups(vector<int>& amount) { int ans = 0; while (amount[0] + amount[1] + amount[2]) { sort(amount.begin(), amount.end()); ++ans; amount[2]--; amount[1] = max(0, amount[1] - 1); } return ans; } }; // Solution 2 class Solution { public: int fillCups(vector<int>& amount) { sort(amount.begin(), amount.end()); if (amount[0] + amount[1] <= amount[2]) { return amount[2]; } return (amount[0] + amount[1] + amount[2] + 1) / 2; } }; -
class Solution: def fillCups(self, amount: List[int]) -> int: ans = 0 while sum(amount): amount.sort() ans += 1 amount[2] -= 1 amount[1] = max(0, amount[1] - 1) return ans # Solution 2 class Solution: def fillCups(self, amount: List[int]) -> int: amount.sort() if amount[0] + amount[1] <= amount[2]: return amount[2] return (sum(amount) + 1) // 2 -
func fillCups(amount []int) int { ans := 0 for amount[0]+amount[1]+amount[2] > 0 { sort.Ints(amount) ans++ amount[2]-- if amount[1] > 0 { amount[1]-- } } return ans } // Solution 2 func fillCups(amount []int) int { sort.Ints(amount) if amount[0]+amount[1] <= amount[2] { return amount[2] } return (amount[0] + amount[1] + amount[2] + 1) / 2 } -
function fillCups(amount: number[]): number { amount.sort((a, b) => a - b); let [a, b, c] = amount; let diff = a + b - c; if (diff <= 0) return c; else return Math.floor((diff + 1) / 2) + c; } -
impl Solution { pub fn fill_cups(mut amount: Vec<i32>) -> i32 { amount.sort(); let dif = amount[0] + amount[1] - amount[2]; if dif <= 0 { return amount[2]; } (dif + 1) / 2 + amount[2] } }