导航装置
难度:
标签:
题目描述
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)
代码细节讲解
🦆
在决定一个节点是否需要导航装置时,仅考虑其左右子节点的状态是不是足够?是否需要考虑其父节点或兄弟节点的状态?
▷🦆
算法中提到,如果左右子树都没有导航装置,则需要在当前节点添加一个导航装置。这种策略是否总是最优的?是否存在一个更有效的分配策略可以减少总体导航装置的数量?
▷🦆
在题解中提到,如果左右子树至少有一个已经有导航装置,根节点的状态会怎样变化?题解中的逻辑是如何确保这种情况下游客在每个景点接收的数据信息都不相同的?
▷