Сложность: medium
На оси X расположены три камня в разных позициях. Вам даны три целых числа a, b и c - позиции камней. За одно движение вы берете камень в конечной точке (т. е. либо в самой низкой, либо в самой высокой позиции камня) и перемещаете его в незанятую позицию между этими конечными точками. Формально, допустим, камни в данный момент находятся в позициях x, y и z, причем x < y < z. Вы берете камень в позиции x или z и перемещаете его в целочисленную позицию k, причем x < k < z и k != y. Игра заканчивается, когда вы больше не можете сделать ни одного хода (то есть камни находятся в трех последовательных позициях). Возвращается целочисленный массив answer длины 2, где: answer[0] - минимальное количество ходов, которое вы можете сыграть, а answer[1] - максимальное количество ходов, которое вы можете сыграть.
Пример:
Input: a = 3, b = 5, c = 1
Output: [1,2]
👨💻 Алгоритм:
1⃣Сортировка позиций:
Убедитесь, что позиции камней отсортированы в порядке возрастания. Обозначим отсортированные позиции как x, y и z.
2⃣Вычисление минимальных ходов:
Если камни уже находятся в последовательных позициях (то есть y - x == 1 и z - y == 1), минимальное количество ходов равно 0.
Если два камня находятся в соседних позициях, а третий камень на расстоянии более чем одна позиция, минимальное количество ходов равно 1.
В остальных случаях минимальное количество ходов равно 2.
3⃣Вычисление максимальных ходов:
Максимальное количество ходов равно сумме расстояний между соседними камнями минус 2, то есть (y - x - 1) + (z - y - 1).
😎 Решение:
function numMovesStones($a, $b, $c) {
$stones = [$a, $b, $c];
sort($stones);
list($x, $y, $z) = $stones;
$minMoves = ($y - $x <= 2 || $z - $y <= 2) ? (($y - $x == 1 && $z - $y == 1) ? 0 : 1) : 2;
$maxMoves = ($y - $x - 1) + ($z - $y - 1);
return [$minMoves, $maxMoves];
}Ставь 👍 и забирай 📚 Базу знаний