这是我参与2022首次更文挑战的第26天,活动详情查看:2022首次更文挑战
今天周五,在看到每日一题后,我觉得还是需要再补一题
找出星型图的中心节点
该题出自力扣的每日一题,第179题 —— 找出星型图的中心节点【简单题】
审题
有一个无向的 星型 图,由 n 个编号从 1 到 n 的节点组成。星型图有一个 中心 节点,并且恰有 n - 1 条边将中心节点与其他每个节点连接起来。
给你一个二维整数数组 edges ,其中 edges[i] = [ui, vi] 表示在节点 ui 和 vi 之间存在一条边。请你找出 并返回 edges 所表示星型图的中心节点。
- 上述就是一个星型图,题目给出一个二维数组
edges = [[1,2],[2,3],[4,2]]
- 需要找出中心节点为 2 ,并且返回
- 解题思路很多种
- 遍历后利用额外的空间,hashMap等,记录重复节点即可
- 真 · 解决方案
- 首先需要知道题目的限定条件:
3 <= n <= 105edges.length == n - 1edges[i].length == 2
- 也就是说,二维数组的长度一定会大于 或者等于 2
- 并且每个二维数组里面的数组,长度一定等于 2
- 所以就无需走遍历了
- 数学思维即可,4个数两两成组,并且一定存在一个中间数
- 只需比对第一二组即可
- 首先需要知道题目的限定条件:
编码
解决一:利用中心节点的连接边,其他节点的度都为1,只有中心节点的度为n-1; 因此遍历后,计算每个节点的度,最终再次遍历后,度为n-1的即为中心节点
public int findCenter(int[][] edges) {
int n = edges.length + 1;
int[] degrees = new int[n + 1];
for (int[] edge : edges) {
degrees[edge[0]]++;
degrees[edge[1]]++;
}
for (int i = 1; ; i++) {
if (degrees[i] == n - 1) {
return i;
}
}
}
解决二:
- 时间复杂度 O(1)
- 空间复杂度 O(1)
public int findCenter(int[][] edges) {
int[] a1 = edges[0];
int[] a2 = edges[1];
if (a1[0] == a2[0] || a1[0] == a2[1]){
return a1[0];
}
return a1[1];
}