841. Keys and Rooms
Есть n комнат, пронумерованных от 0 до n - 1, и все комнаты закрыты, кроме комнаты 0. Ваша цель — посетить все комнаты. Однако вы не можете войти в закрытую комнату, не имея ключа от нее.
Когда вы посещаете комнату, вы можете find в ней набор различных ключей. Каждый ключ имеет номер, указывающий, какую комнату он открывает, и вы можете взять их все с собой, чтобы открыть другие комнаты.
Дан mảng rooms, где rooms[i] — это набор ключей, которые вы можете получить, если посетите комнату i. return true, если вы можете посетить все комнаты, или false в противном случае.
Ví dụ:
Input: rooms = [[1],[2],[3],[]]
Output: true
Explanation:
We visit room 0 and pick up key 1.
We then visit room 1 and pick up key 2.
We then visit room 2 and pick up key 3.
We then visit room 3.
Since we were able to visit every room, we return true.
C# lời giải
đã khớp/gốcpublic class Solution {
public bool CanVisitAllRooms(IList<IList<int>> rooms) {
bool[] seen = new bool[rooms.Count];
seen[0] = true;
Stack<int> stack = new Stack<int>();
stack.Push(0);
while (stack.Count > 0) {
int node = stack.Pop();
foreach (int nei in rooms[node]) {
if (!seen[nei]) {
seen[nei] = true;
stack.Push(nei);
}
}
}
foreach (bool v in seen) {
if (!v) return false;
}
return true;
}
}
C++ lời giải
bản nháp tự động, xem lại trước khi gửi#include <bits/stdc++.h>
using namespace std;
// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
public bool CanVisitAllRooms(IList<vector<int>> rooms) {
bool[] seen = new bool[rooms.size()];
seen[0] = true;
stack<int> stack = new stack<int>();
stack.push(0);
while (stack.size() > 0) {
int node = stack.pop();
foreach (int nei in rooms[node]) {
if (!seen[nei]) {
seen[nei] = true;
stack.push(nei);
}
}
}
foreach (bool v in seen) {
if (!v) return false;
}
return true;
}
}
Java lời giải
đã khớp/gốcclass Solution {
public boolean canVisitAllRooms(List<List<Integer>> rooms) {
boolean[] seen = new boolean[rooms.size()];
seen[0] = true;
Stack<Integer> stack = new Stack();
stack.push(0);
while (!stack.isEmpty()) {
int node = stack.pop();
for (int nei: rooms.get(node))
if (!seen[nei]) {
seen[nei] = true;
stack.push(nei);
}
}
for (boolean v: seen)
if (!v) return false;
return true;
}
}
JavaScript lời giải
đã khớp/gốcvar canVisitAllRooms = function(rooms) {
let seen = new Array(rooms.length).fill(false);
seen[0] = true;
let stack = [0];
while (stack.length > 0) {
let node = stack.pop();
for (let nei of rooms[node]) {
if (!seen[nei]) {
seen[nei] = true;
stack.push(nei);
}
}
}
return seen.every(Boolean);
};
Go lời giải
đã khớp/gốcfunc canVisitAllRooms(rooms [][]int) bool {
seen := make([]bool, len(rooms))
seen[0] = true
stack := []int{0}
for len(stack) > 0 {
node := stack[len(stack)-1]
stack = stack[:len(stack)-1]
for _, nei := range rooms[node] {
if !seen[nei] {
seen[nei] = true
stack = append(stack, nei)
}
}
}
for _, v := range seen {
if !v {
return false
}
}
return true
}
Algorithm
Создайте mảng seen для отслеживания посещенных комнат и стек stack для ключей, которые нужно использовать.
Поместите ключ от комнаты 0 в стек и отметьте комнату 0 как посещенную.
Пока стек не пуст, извлекайте ключи из стека и используйте их для открытия новых комнат, добавляя найденные ключи в стек. Если все комнаты посещены, return true, иначе false.
😎
Vacancies for this task
việc làm đang hoạt động with overlapping task tags are đã hiển thị.