【dfs】B014_房间和钥匙(dfs | bfs)

一、题目描述

有 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 号房间。

二、题解

方法一:dfs

如果在 set 中没有这个房间号,可以判断该房间是没有被开启过的,可继续从该房间深搜

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);
	  }
	}
}

复杂度分析

  • 时间复杂度: O ( n × m ) O(n × m)
  • 空间复杂度: O ( n × m ) O(n × m)

方法二:bfs

bfs 主题逻辑是一样的实现思路稍有不同。

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);
      }
    }
  }
}

复杂度分析

  • 时间复杂度: O ( n × m ) O(n × m)
  • 空间复杂度: O ( n × m ) O(n × m)
发布了495 篇原创文章 · 获赞 105 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_43539599/article/details/104788912