题目描述
有一个无向的 星型 图,由 n
个编号从 1
到 n
的节点组成。星型图有一个 中心 节点,并且恰有 n - 1
条边将中心节点与其他每个节点连接起来。
给你一个二维整数数组 edges
,其中 edges[i] = [u_i, v_i]
表示在节点 u_i
和 v_i
之间存在一条边。请你找出并返回 edges
所表示星型图的中心节点。
样例
输入:edges = [[1,2],[2,3],[4,2]]
输出:2
解释:如上图所示,节点 2 与其他每个节点都相连,所以节点 2 是中心节点。
输入:edges = [[1,2],[5,1],[1,3],[1,4]]
输出:1
限制
3 <= n <= 10^5
edges.length == n - 1
edges[i].length == 2
1 <= u_i, v_i <= n
u_i != v_i
- 题目数据给出的
edges
表示一个有效的星型图。
算法
(哈希表) $O(n + m)$
- 由于题目保证了给定的图一定是一个有效的星型图,所以直接统计每个点的度数,找出度数大于 1 的那个点输出。
时间复杂度
- 遍历所有边和点一次,故总时间复杂度为 $O(n + m)$。
空间复杂度
- 需要 $O(n)$ 的额外空间存储每个点的度数。
C++ 代码
class Solution {
public:
int findCenter(vector<vector<int>>& edges) {
unordered_map<int, int> deg;
for (const auto &e : edges) {
int x = e[0], y = e[1];
deg[x]++; deg[y]++;
}
for (const auto &[k, v] : deg)
if (v > 1)
return k;
return -1;
}
};