leetcode刷题记录-1791. 找出星型图的中心节点 - 节点度

186 阅读3分钟

「这是我参与2022首次更文挑战的第22天,活动详情查看:2022首次更文挑战

前言

今日的题目为简单,并且如果以解题为目标的话确实特别简单,但是做题不能只是为了解题,要去了解一下这道题目背后考查的知识点。

每日一题

今天的每日一题 1791. 找出星型图的中心节点,难度为简单

  • 有一个无向的 星型 图,由 n 个编号从 1 到 n 的节点组成。星型图有一个 中心 节点,并且恰有 n - 1 条边将中心节点与其他每个节点连接起来。

  • 给你一个二维整数数组 edges ,其中 edges[i] = [ui, vi] 表示在节点 ui 和 vi 之间存在一条边。请你找出并返回 edges 所表示星型图的中心节点。

 

示例 1:

image.png

输入: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 表示一个有效的星型图

题解

傻瓜解法

今天看到这道题,第一反应都啥了,好像有点简单,题目给的一定是一个有效的星型图,并且给的两个数字一定是不同的,那么就是说,每个数组都会出现的数就是我们要的中心点。

那么在简洁一点,给的数组最少会有两个,前两个数组中,两两不相等,并且两个数组中有一个一定相等,那个相等的数,就是我们要的中心节点。

image.png

/**
 * @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
    }
};

image.png

题目背后的知识点-度

通过最简单的解法当然是能够解出题目,但是我们还应该去学习一下它背后真正要考查的思维,这道题所涉及到的就是节点的度。

什么是节点的度

节点度是指和该节点相关联的边的条数,又称关联度。

特别的在有向图当中。

节点的入度 是指进入该节点的边的条数;

节点的出度 是指从该节点出发的边的条数。

利用节点度解题

如下图就是在节点为 4 的时候各个节点的度:

image.png

我们可以看的出,不论节点有多少个,我们的中心节点的度都一定是为 n-1,边缘节点的度都是 1。

所以我们只要计算出所有节点的度,度为 n-1 的就是我们需要求的中心节点。

  1. 通过新建一个长度为 edges.length + 1 的数组来保存每个节点的度。

  2. 遍历输入的二维数组,每个数出现一次,则该点的度加一。

  3. 最后循环保存度的数组,找到度为 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;
};

image.png