365. Water and Jug Problem
DifficultyMedium
Description
You are given two jugs with capacities x liters and y liters. You have an infinite water supply. Return whether the total amount of water in both jugs may reach target using the following operations:
- Fill either jug completely with water.
- Completely empty either jug.
- Pour water from one jug into another until the receiving jug is full, or the transferring jug is empty.
Example 1:
Input: x = 3, y = 5, target = 4
Output: true
Explanation:
Follow these steps to reach a total of 4 liters:
- Fill the 5-liter jug (0, 5).
- Pour from the 5-liter jug into the 3-liter jug, leaving 2 liters (3, 2).
- Empty the 3-liter jug (0, 2).
- Transfer the 2 liters from the 5-liter jug to the 3-liter jug (2, 0).
- Fill the 5-liter jug again (2, 5).
- Pour from the 5-liter jug into the 3-liter jug until the 3-liter jug is full. This leaves 4 liters in the 5-liter jug (3, 4).
- Empty the 3-liter jug. Now, you have exactly 4 liters in the 5-liter jug (0, 4).
Reference: The Die Hard example.
Example 2:
Input: x = 2, y = 6, target = 5
Output: false
Example 3:
Input: x = 1, y = 2, target = 3
Output: true
Explanation: Fill both jugs. The total amount of water in both jugs is equal to 3 now.
Constraints:
1 <= x, y, target <= 103
Solutions
Solution 1: DFS
Thinking
Two jugs of capacities \(x,y\); can we measure \(z\)? Bézout’s identity says \(z\) must be a multiple of \(\gcd(x,y)\). A state search also decides it. There are \(O(xy)\) states.
\(\textit{dfs}(i,j)\) is the current pair. A seen state fails; a jug or their sum equal to \(z\) succeeds. Otherwise fill, empty, or pour. Start from \((0,0)\).
Let's denote \(\textit{jug1Capacity}\) as \(x\), \(\textit{jug2Capacity}\) as \(y\), and \(\textit{targetCapacity}\) as \(z\).
Next, we design a function \(\textit{dfs}(i, j)\), which represents whether we can get \(z\) liters of water when there are \(i\) liters of water in \(\textit{jug1}\) and \(j\) liters of water in \(\textit{jug2}\).
The execution process of the function \(\textit{dfs}(i, j)\) is as follows:
- If \((i, j)\) has been visited, return \(\textit{false}\).
- If \(i = z\) or \(j = z\) or \(i + j = z\), return \(\textit{true}\).
- If we can get \(z\) liters of water by filling \(\textit{jug1}\) or \(\textit{jug2}\), or emptying \(\textit{jug1}\) or \(\textit{jug2}\), return \(\textit{true}\).
- If we can get \(z\) liters of water by pouring water from \(\textit{jug1}\) into \(\textit{jug2}\), or pouring water from \(\textit{jug2}\) into \(\textit{jug1}\), return \(\textit{true}\).
The answer is \(\textit{dfs}(0, 0)\).
The time complexity is \(O(x + y)\), and the space complexity is \(O(x + y)\), where \(x\) and \(y\) are the sizes of \(\textit{jug1Capacity}\) and \(\textit{jug2Capacity}\) respectively.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | |