算法小知识-------02·18-------每日一题 + 热题

135 阅读2分钟

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

今天周五,在看到每日一题后,我觉得还是需要再补一题

找出星型图的中心节点

该题出自力扣的每日一题,第179题 —— 找出星型图的中心节点【简单题】

审题

有一个无向的 星型 图,由 n 个编号从 1 到 n 的节点组成。星型图有一个 中心 节点,并且恰有 n - 1 条边将中心节点与其他每个节点连接起来。
给你一个二维整数数组 edges ,其中 edges[i] = [ui, vi] 表示在节点 ui 和 vi 之间存在一条边。请你找出 并返回 edges 所表示星型图的中心节点。

image.png

  • 上述就是一个星型图,题目给出一个二维数组
edges = [[1,2],[2,3],[4,2]]
  • 需要找出中心节点为 2 ,并且返回
  • 解题思路很多种
    • 遍历后利用额外的空间,hashMap等,记录重复节点即可
    • 真 · 解决方案
      • 首先需要知道题目的限定条件:
        • 3 <= n <= 105
        • edges.length == n - 1
        • edges[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];
    }

image.png