leetcode
leetcode 2851 ~ 2900
导航装置

导航装置

难度:

标签:

题目描述

English description is not available for the problem. Please switch to Chinese.

代码结果

运行时间: 352 ms, 内存: 40.3 MB


/*
 * 题目思路:
 * 1. 给定一个二叉树结构的景区,每个节点代表一个景点。
 * 2. 要在若干景点设置导航装置,使得每个景点接收到的导航数据列表皆不相同。
 * 3. 最少需要设置多少个导航装置?
 * 4. 使用贪心算法,从叶子节点开始,尽量少设置装置,逐层向上保证所有节点的数据列表唯一。
 * 5. 使用Java Stream来简化某些集合操作。
 */

import java.util.*;
import java.util.stream.Collectors;

public class Solution {
    public int minNavigationDevices(TreeNode root) {
        if (root == null) return 0;
        Set<TreeNode> hasDevice = new HashSet<>();
        Set<TreeNode> covered = new HashSet<>();
        return dfs(root, hasDevice, covered) ? 1 : 2;
    }

    private boolean dfs(TreeNode node, Set<TreeNode> hasDevice, Set<TreeNode> covered) {
        if (node == null) return false;
        boolean leftCovered = dfs(node.left, hasDevice, covered);
        boolean rightCovered = dfs(node.right, hasDevice, covered);
        if (Stream.of(node.left, node.right)
            .filter(Objects::nonNull)
            .anyMatch(child -> !covered.contains(child))) {
            hasDevice.add(node);
            covered.add(node);
            Stream.of(node.left, node.right)
                .filter(Objects::nonNull)
                .forEach(covered::add);
            return true;
        }
        return hasDevice.contains(node);
    }

    public static class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode(int x) { val = x; }
    }
}

解释

方法:

题解通过深度优先搜索(DFS)遍历二叉树来确定最少需要设置的导航装置数量。核心思想是利用树的每个节点的左右子树的状态来确定该节点是否需要导航装置。在遍历过程中,使用递归函数dfs来处理每个节点。如果一个节点的左右子树都不存在导航装置,则至少要在一个子树上放置导航装置。如果左右子树至少有一个已经有导航装置,则根据情况设置根节点是否需要导航装置。通过这种方式,可以确保在满足题目要求的情况下,使用最少的导航装置。

时间复杂度:

O(N)

空间复杂度:

O(N)

代码细节讲解

🦆
在决定一个节点是否需要导航装置时,仅考虑其左右子节点的状态是不是足够?是否需要考虑其父节点或兄弟节点的状态?
在这个特定问题中,决定一个节点是否需要导航装置主要依赖于其子节点的状态,因为这是一个从下至上的决策过程。每个节点的决策仅依赖于其直接子节点的状态,而不需要考虑其父节点或兄弟节点的状态。这是因为导航设备的最优放置需要确保从任意节点访问其任一子节点时都能被导航设备覆盖。因此,每个节点的决策可以独立于其他非直接子节点的状态进行。
🦆
算法中提到,如果左右子树都没有导航装置,则需要在当前节点添加一个导航装置。这种策略是否总是最优的?是否存在一个更有效的分配策略可以减少总体导航装置的数量?
在当前算法的架构下,如果左右子树都没有导航装置,则在当前节点添加导航装置是必要的,以确保子节点被覆盖。这种策略是基于贪心算法,旨在立即解决未被覆盖的子树问题,通常这种策略是有效的。然而,可能存在特定的树形结构,其中通过更加全局的视角(可能需要更复杂的动态规划方法)来优化导航装置的总数。但对于大多数情况,当前的策略已经提供了一个非常接近最优的解决方案。
🦆
在题解中提到,如果左右子树至少有一个已经有导航装置,根节点的状态会怎样变化?题解中的逻辑是如何确保这种情况下游客在每个景点接收的数据信息都不相同的?
如果左右子树至少有一个已经有导航装置,则根节点可能不需要额外的导航装置,因为至少有一个子节点已被覆盖,从而提供给根节点所需的导航信息。题解中的逻辑通过确保每个节点或其任一子节点有导航装置,保证了游客在每个景点都能接收到数据信息。这一策略通过在树的每个必要节点上放置导航装置,确保信息的全覆盖而不重复,从而满足题目要求的效果。

相关问题