殊途同归
难度:
标签:
题目描述
代码结果
运行时间: 133 ms, 内存: 25.9 MB
/*
题目思路:
使用Java Stream API实现同样的功能。利用递归函数和流来进行深度优先搜索,并收集所有路径。
*/
import java.util.*;
import java.util.stream.Collectors;
class Solution {
public List<List<Integer>> allPathsSourceTarget(int[][] graph) {
return dfs(graph, 0);
}
private List<List<Integer>> dfs(int[][] graph, int node) {
if (node == graph.length - 1) {
return Collections.singletonList(Collections.singletonList(node));
}
return Arrays.stream(graph[node])
.mapToObj(next -> dfs(graph, next).stream()
.map(path -> {
List<Integer> newPath = new ArrayList<>();
newPath.add(node);
newPath.addAll(path);
return newPath;
})
.collect(Collectors.toList()))
.flatMap(Collection::stream)
.collect(Collectors.toList());
}
}
解释
方法:
该题解利用位操作和邻接矩阵的思想求解。首先,通过一个数组 `masks` 构建每个房间的邻接房间的位掩码表示。对于每对房间 (r1, r2),设置 r1 的位掩码中 r2 位为 1,反之亦然,表示 r1 和 r2 之间有直接连接。接下来,对于每条走廊 (r1, r2),计算 r1 和 r2 的邻接掩码的位与操作,这可以找出同时与 r1 和 r2 直接相连的房间。通过位操作计算,筛选出介于 r1 和 r2 之间的房间,利用 `bit_count()` 方法计算这些房间的数量,这些房间即为同时与 r1 和 r2 直接相连的房间。
时间复杂度:
O(E)
空间复杂度:
O(n)
代码细节讲解
🦆
在构建邻接房间位掩码数组`masks`时,为什么选择位操作而不是使用列表或字典来存储邻接房间信息?
▷🦆
你在计算两个房间的邻接掩码交集时使用了表达式`masks[r1] & masks[r2] & ((1 << r2) - 1) & ~((1 << (r1 + 1)) - 1)`,能详细解释每部分表达式的具体作用和目的吗?
▷🦆
算法中提到的`bit_count()`方法是如何工作的,以及它在这个上下文中的作用是什么?
▷