[Dfs] B014_ room and keys (dfs | bfs)

One, Title Description

有 N 个房间,开始时你位于 0 号房间。每个房间有不同的号码:012...,N-1,
并且房间里可能有一些钥匙能使你进入下一个房间。

在形式上,对于每个房间 i 都有一个钥匙列表 rooms[i],每个钥匙 rooms[i][j][0,1...,N-1] 中的一个整数表示,
其中 N = rooms.length。 钥匙 rooms[i][j] = v 可以打开编号为 v 的房间。

最初,除 0 号房间外的其余所有房间都被锁住。

你可以自由地在房间之间来回走动。

如果能进入每个房间返回 true,否则返回 false。

输入:[[1,3],[3,0,1],[2],[0]]
输出:false
解释:我们不能进入 2 号房间。

Second, the problem solution

Method One: dfs

If this is not the room number in the set may be determined that the room is not being turned off, the search may be continued from the dark room

Set<Integer> set = null;
public boolean canVisitAllRooms(List<List<Integer>> rooms) {
  set = new HashSet<>();
  dfs(rooms, 0);
  // for (int i : set)   System.out.println(i);
  return set.size() == rooms.size();
}
private void dfs(List<List<Integer>> rooms, int rId) {
  if (set.contains(rId))
    return;
  set.add(rId);
  for (int id : rooms.get(rId)) {
    if (!set.contains(id)) {
      dfs(rooms, id);
    }
  }
}
private void bfs(List<List<Integer>> rooms, int rId) {
	Stack<Integer> stack = new Stack<>();
	stack.push(rId);
	
	while (!stack.isEmpty()) {
	  int id = stack.pop();
	  set.add(id);
	  for (int key : rooms.get(id)) {
	    if (!set.contains(key))
	        stack.push(key);
	  }
	}
}

Complexity Analysis

  • time complexity: O ( n × m ) O(n × m)
  • Space complexity: O ( n × m ) O(n × m)

Method Two: bfs

bfs theme is the same logic to achieve slightly different idea.

Set<Integer> set = null;
public boolean canVisitAllRooms(List<List<Integer>> rooms) {
  set = new HashSet<>();
  bfs(rooms, 0);
  return set.size() == rooms.size();
}
private void bfs(List<List<Integer>> rooms, int rId) {
  Queue<Integer> queue = new LinkedList<>();
  queue.add(rId);

  while (!queue.isEmpty()) {
    int id = queue.poll();
    set.add(id);
    for (int key : rooms.get(id)) {
      if (!set.contains(key)) {
        queue.add(key);
      }
    }
  }
}

Complexity Analysis

  • time complexity: O ( n × m ) O(n × m)
  • Space complexity: O ( n × m ) O(n × m)
Published 495 original articles · won praise 105 · views 30000 +

Guess you like

Origin blog.csdn.net/qq_43539599/article/details/104788912