LeetCode Solutions (161 серия деталей)
Это является частью серии объяснений решения LeetCode ( index ). Если вам понравилось это решение или нашли его полезным, Пожалуйста, нравится Этот пост и/или upvote Мое решение по сообщению на форумах LeetCode Анкет
Проблема LeetCode #841 (средний): клавиши и комнаты
Описание:
( прыгнуть в : Идея решения Код : JavaScript | Python | Java | C ++
Есть N
Номера и вы начинаете в комнате 0
Анкет Каждая комната имеет отчетливое число в 0, 1, 2, ..., N-1
и в каждой комнате могут быть несколько ключей для доступа к следующей комнате.
Формально, каждая комната я
имеет список ключей Номера [i]
и каждый ключ Номера [i] [J]
целое число в [0, 1, ..., N-1]
где N.Length
Анкет Ключ Номера [i] [J]
Открывает комнату с номером V
Анкет
Первоначально все комнаты начинаются заперты (за исключением комнаты 0
).
Вы можете свободно ходить туда -сюда между комнатами.
Возврат Верно
Если и только если вы можете войти в каждую комнату.
Примеры:
Вход: | [[1],[2],[3],[]] |
Выход: | истинный |
Объяснение: | Мы начинаем в комнате 0 и подбираем ключ 1. Затем мы идем в комнату 1 и поднимаем ключ 2. Затем мы идем в комнату 2 и поднимаем ключ 3. Затем мы идем в комнату 3. Поскольку мы смогли пойти в каждую комнату, мы вернемся. |
Вход: | [[1,3],[3,0,1],[2],[0]] |
Выход: | ЛОЖЬ |
Объяснение: | Мы не можем войти в комнату с номером 2. |
Ограничения:
1. длиной
0 [i] .length
- Количество ключей во всех комбинированных комнатах больше всего
3000
Анкет
Идея:
( Прыгните к : Описание задачи Код : JavaScript | Python | Java | C ++
Поскольку мы можем войти только в комнаты, в которые мы нашли ключ, мы не можем просто итерации по всему входному массиву ( r ) обычно. Если мы думаем об этом как о проблеме с графиком, мы видим, что комнаты похожи на узлы, а ключи похожи на края.
В этом случае мы можем использовать Широкий первый поиск ( bfs ) очередь или Глубина-первый поиск ( dfs ) стек подход, или даже DFS Recursion Подходите к хорошему эффекту. Здесь мы нажимаем недавно найденные ключи на стек Как мы проходим.
Чтобы устранить дублирующие записи стека, мы можем использовать легкий Логический массив ( vis ), чтобы отслеживать, какие комнаты уже были выдвинуты на стек. Вместо того, чтобы снова подсчитать количество посещаемых комнат в конце, мы можем просто использовать другую переменную ( count ), чтобы отслеживать это отдельно.
Как только наш стек запускается пустым, мы можем просто проверить, если счет так же, как длину R и возврат ответ.
Реализация:
JavaScript может использовать Uint8Array вместо логического массива.
Код JavaScript:
( Прыгните к : Описание задачи Идея решения
var canVisitAllRooms = function(R) { let vis = new Uint8Array(R.length), stack = [0], count = 1 vis[0] = 1 while (stack.length) { let keys = R[stack.pop()] for (let k of keys) if (!vis[k]) stack.push(k), vis[k] = 1, count++ } return R.length === count };
Код Python:
( Прыгните к : Описание задачи Идея решения
class Solution: def canVisitAllRooms(self, R: List[List[int]]) -> bool: vis, stack, count = [False for _ in range(len(R))], [0], 1 vis[0] = 1 while stack: keys = R[stack.pop()] for k in keys: if not vis[k]: stack.append(k) vis[k] = True count += 1 return len(R) == count
Код Java:
( Прыгните к : Описание задачи Идея решения
class Solution { public boolean canVisitAllRooms(List> R) { boolean[] vis = new boolean[R.size()]; vis[0] = true; Stack
stack = new Stack<>(); stack.push(0); int count = 1; while (stack.size() > 0) for (int k : R.get(stack.pop())) if (!vis[k]) { stack.push(k); vis[k] = true; count++; } return R.size() == count; } }
C ++ Код:
( Прыгните к : Описание задачи Идея решения
class Solution { public: bool canVisitAllRooms(vector>& R) { vector vis(R.size(), false); vis[0] = true; stack stk = stack ({0}); int count = 1; while (stk.size()) { vector keys = R[stk.top()]; stk.pop(); for (int k : keys) if (!vis[k]) stk.push(k), vis[k] = true, count++; } return R.size() == count; } };
LeetCode Solutions (161 серия деталей)
Оригинал: “https://dev.to/seanpgallivan/solution-keys-and-rooms-33oh”