Рубрики
Без рубрики

Решение: ключи и комнаты

Это является частью серии объяснений решений LeetCode (индекс). Если вам понравилось это решение или fou … с меткой алгоритмы, JavaScript, Java, Python.

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”