leetcode
leetcode 1851 ~ 1900
殊途同归

殊途同归

难度:

标签:

题目描述

代码结果

运行时间: 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`时,为什么选择位操作而不是使用列表或字典来存储邻接房间信息?
位操作相较于列表或字典具有空间效率高和处理速度快的优势。使用位掩码(bitmask)可以将房间的连接状态压缩到整数的单个位上,这样可以用非常紧凑的方式表示大量的布尔信息。每个整数可以表示多达32或64个房间的连接状态(取决于整数的位数),这种方法减少了内存消耗,并且由于位运算(如AND, OR)在现代计算机上非常高效,因此可以提高算法的执行速度。此外,位操作使得比较和计算两个房间的共同邻接房间更为直接和快速。
🦆
你在计算两个房间的邻接掩码交集时使用了表达式`masks[r1] & masks[r2] & ((1 << r2) - 1) & ~((1 << (r1 + 1)) - 1)`,能详细解释每部分表达式的具体作用和目的吗?
`masks[r1] & masks[r2]`计算了房间r1和r2共同直接连接的房间的位掩码。`((1 << r2) - 1)`生成一个从位0到位r2-1的掩码,这保证了我们只考虑房间号小于r2的房间。`~((1 << (r1 + 1)) - 1)`生成一个掩码,从位r1+1开始到最高位都是1,这确保我们不考虑房间号小于或等于r1的房间。这样,整个表达式确保我们只计算房间号在r1和r2之间的房间的数量,即只统计位于r1和r2之间的共同直接连接的房间。
🦆
算法中提到的`bit_count()`方法是如何工作的,以及它在这个上下文中的作用是什么?
`bit_count()`方法是一种计算整数中设置为1的位数(即计算位为1的数量)的方法。在这个上下文中,我们使用`bit_count()`来计算满足特定条件(即同时与两个指定房间直接相连的房间数量)的房间数量。经过位掩码计算后,结果整数中的每个设置为1的位代表一个符合条件的房间,`bit_count()`帮助我们快速统计这些房间的总数,从而确定有多少路径可以连接给定的两个房间。这是解决问题的关键步骤之一,有效利用了位操作的高效处理能力。

相关问题