「这是我参与2022首次更文挑战的第22天,活动详情查看: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 表示一个有效的星型图
题解
傻瓜解法
今天看到这道题,第一反应都啥了,好像有点简单,题目给的一定是一个有效的星型图,并且给的两个数字一定是不同的,那么就是说,每个数组都会出现的数就是我们要的中心点。
那么在简洁一点,给的数组最少会有两个,前两个数组中,两两不相等,并且两个数组中有一个一定相等,那个相等的数,就是我们要的中心节点。
/**
* @param {number[][]} edges
* @return {number}
*/
var findCenter = function(edges) {
let a = edges[0][0]
let b = edges[0][1]
let c = edges[1][0]
let d = edges[1][1]
if(a==c){
return a
}
if(a==d){
return a
}
if(b==d){
return b
}
if(b==c){
return b
}
};
题目背后的知识点-度
通过最简单的解法当然是能够解出题目,但是我们还应该去学习一下它背后真正要考查的思维,这道题所涉及到的就是节点的度。
什么是节点的度
节点度是指和该节点相关联的边的条数,又称关联度。
特别的在有向图当中。
节点的入度 是指进入该节点的边的条数;
节点的出度 是指从该节点出发的边的条数。
利用节点度解题
如下图就是在节点为 4 的时候各个节点的度:
我们可以看的出,不论节点有多少个,我们的中心节点的度都一定是为 n-1,边缘节点的度都是 1。
所以我们只要计算出所有节点的度,度为 n-1 的就是我们需要求的中心节点。
-
通过新建一个长度为
edges.length + 1的数组来保存每个节点的度。 -
遍历输入的二维数组,每个数出现一次,则该点的度加一。
-
最后循环保存度的数组,找到度为 n-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]]++;
}
for (let i = 1; i <= n; i++) {
if (degrees[i] === n - 1) {
return i;
}
}
return 0;
};