「这是我参与2022首次更文挑战的第31,活动详情查看:2022首次更文挑战」
1791. 找出星型图的中心节点
有一个无向的 星型 图,由 n 个编号从 1 到 n 的节点组成。星型图有一个 中心 节点,并且恰有 n - 1 条边将中心节点与其他每个节点连接起来。
给你一个二维整数数组 edges ,其中 edges[i] = [ui, vi] 表示在节点 ui 和 vi 之间存在一条边。请你找出并返回 edges 所表示星型图的中心节点。
示例 1:
输入:edges = [[1,2],[2,3],[4,2]] 输出:2 解释:如上图所示,节点 2 与其他每个节点都相连,所以节点 2 是中心节点。
示例 2:
输入:edges = [[1,2],[5,1],[1,3],[1,4]] 输出:1
提示:
3 <= n <= 105 edges.length == n - 1 edges[i].length == 2 1 <= ui, vi <= n ui != vi 题目数据给出的 edges 表示一个有效的星型图
分析
题目中给出这个星型图是由于编号为1 到 n 的节点组成一共有n个节点。会给我们一个二维整数数组 edges, edges中的每一项都表示了中心节点与边节点的关系。然而题目中也给出了有 n - 1 条边将中心节点与其他每个节点连接起来,也是就是说 n = edges.length + 1。
我们在示例1中验证一下:
出图中我们可以看出一个有4个节点n=4,edges = [[1,2],[2,3],[4,2]] 数组长为3正好是n-1。也就是说 edges 其实就是描述边节点与中心节点的关系。
找到 edges 是干啥的我们可以得出俩种解决方案:
-
由于
edges是描述边节点与中心节点的关系,那么中心节点必然出现n-1次。我们可以通过节点编号出现的次数来找寻中心节点。 -
由于
edges是描述边节点与中心节点的关系,那么其实前俩项的时候中心就会出现俩次,我们可以通过判断第一项中哪一个节点编号与另一项的哪一个编号一样就能找出中心节点。
分步实现1
首先初始化变量n并赋值为edges.length + 1。
定义变量 degrees 长度为n+1并填充每一项0。这里说一下为啥需要数组长度为n+1,这是因为数组下标是从0开始的而节点编号是从1开始的这样就能更好的去统计节点编号出现的次数。
const n = edges.length + 1;
const degrees = new Array(n).fill(0);
通过循环edges数组我们就能统计出现节点编号出现的次数,通过indexOf找到出现n-1次的节点编号,这个节点编号就是我们所需要的中心节点编号
for (const edge of edges) {
degrees[edge[0]]++;
degrees[edge[1]]++;
}
return degrees.indexOf(n-1);
代码实现1
/**
* @param {number[][]} edges
* @return {number}
*/
var findCenter = function(edges) {
const n = edges.length + 1;
const degrees = new Array(n + 1).fill(0);
for (const edge of edges) {
degrees[edge[0]]++;
degrees[edge[1]]++;
}
return degrees.indexOf(n-1);
};
分步实现2
我们可以通过判断 edges[0][0] 是否在节点edges[1]中出现过,如果出现则就是中心节点否则则 edges[0][1] 是中心节点。
if(edges[0][0] === edges[1][0] || edges[0][0] === edges[1][1]){
return edges[0][0]
}else{
return edges[0][1]
}
代码实现2
/**
* @param {number[][]} edges
* @return {number}
*/
var findCenter = function(edges) {
if(edges[0][0] === edges[1][0] || edges[0][0] === edges[1][1]){
return edges[0][0]
}else{
return edges[0][1]
}
};