There are three stones in different positions on the X-axis. You are given three integers a
, b
, and c
, the positions of the stones.
In one move, you pick up a stone at an endpoint (i.e., either the lowest or highest position stone), and move it to an unoccupied position between those endpoints. Formally, let's say the stones are currently at positions x
, y
, and z
with x < y < z
. You pick up the stone at either position x
or position z
, and move that stone to an integer position k
, with x < k < z
and k != y
.
The game ends when you cannot make any more moves (i.e., the stones are in three consecutive positions).
Return an integer array answer
of length 2
where:
answer[0]
is the minimum number of moves you can play, andanswer[1]
is the maximum number of moves you can play.
Example 1:
Input: a = 1, b = 2, c = 5 Output: [1,2] Explanation: Move the stone from 5 to 3, or move the stone from 5 to 4 to 3.
Example 2:
Input: a = 4, b = 3, c = 2 Output: [0,0] Explanation: We cannot make any moves.
Example 3:
Input: a = 3, b = 5, c = 1 Output: [1,2] Explanation: Move the stone from 1 to 4; or move the stone from 1 to 2 to 4.
Constraints:
1 <= a, b, c <= 100
a
, b
, and c
have different values.This problem involves finding the minimum and maximum number of moves required to arrange three stones on a number line such that they are consecutive.
Core Idea: The solution leverages the fact that the minimum and maximum number of moves are directly related to the range and distribution of the stones' initial positions.
Algorithm:
Find Extremes: Determine the minimum (x
) and maximum (z
) positions of the stones.
Find Middle: Calculate the position of the middle stone (y
) using the fact that a + b + c = x + y + z
.
Minimum Moves:
z - x
) is less than or equal to 2, the stones are already consecutive or only one move is needed, so minMoves = 0
or 1
.y - x
or z - y
) is less than 3, only one move is needed; otherwise, two moves are necessary.Maximum Moves: The maximum number of moves is simply the range minus 2 (z - x - 2
). This is because the maximum number of gaps to fill between the stones is z-x-2
. Each gap requires one move.
Time and Space Complexity:
Code Explanation (Python):
class Solution:
def numMovesStones(self, a: int, b: int, c: int) -> List[int]:
x, z = min(a, b, c), max(a, b, c) #Find min and max positions
y = a + b + c - x - z #Find middle position
min_moves = 0
max_moves = 0
if z - x > 2: #Check if stones are not already consecutive or one move away
min_moves = 1 if (y - x < 3 or z - y < 3) else 2 #Check if one or two moves are needed for minimum
max_moves = z - x - 2 #Calculate maximum moves
return [min_moves, max_moves]
The code in other languages (Java, C++, Go, TypeScript) follows the same logic with syntactic variations. They all efficiently compute the minimum and maximum moves based on the positions of the three stones.