Redian新闻
>
LeetCode 力扣官方题解 | 1791. 找出星型图的中心节点

LeetCode 力扣官方题解 | 1791. 找出星型图的中心节点

公众号新闻

点击上方蓝字设为星标

下面开始今天的学习~

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



解决方案


方法一:算每个节点的度


思路


由 n 个节点组成的星型图中,有一个中心节点,有 n - 1 条边分别连接中心节点和其余的每个节点。因此,中心节点的度是 n - 1,其余每个节点的度都是 1。一个节点的度的含义是与该节点相连的边数。

遍历 edges 中的每条边并计算每个节点的度,度为 n - 1 的节点即为中心节点。


代码

Python3

class Solution:    def findCenter(self, edges: List[List[int]]) -> int:        n = len(edges) + 1        degrees = [0] * (n + 1)        for x, y in edges:            degrees[x] += 1            degrees[y] += 1        for i, d in enumerate(degrees):            if d == n - 1:                return i


Java

class Solution {    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;            }        }    }}

C#

public class Solution {    public int FindCenter(int[][] edges) {        int n = edges.Length + 1;        int[] degrees = new int[n + 1];        foreach (int[] edge in edges) {            degrees[edge[0]]++;            degrees[edge[1]]++;        }        for (int i = 1; ; i++) {            if (degrees[i] == n - 1) {                return i;            }        }    }}

C++

class Solution {public:    int findCenter(vector<vector<int>>& edges) {        int n = edges.size() + 1;        vector<int> degrees(n + 1);        for (auto & edge : edges) {            degrees[edge[0]]++;            degrees[edge[1]]++;        }        for (int i = 1; ; i++) {            if (degrees[i] == n - 1) {                return i;            }        }    }};


C

int findCenter(int** edges, int edgesSize, int* edgesColSize){    int n = edgesSize + 1;    int * degrees = (int *)malloc(sizeof(int) * (n + 1));    memset(degrees,0,sizeof(int) * (n + 1));    for (int i = 0; i < edgesSize; i++) {        degrees[edges[i][0]]++;        degrees[edges[i][1]]++;    }    for (int i = 1; ; i++) {        if (degrees[i] == n - 1) {            free(degrees);            return i;        }    }}


JavaScript

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++) {        if (degrees[i] === n - 1) {            return i;        }    }};


Golang

func findCenter(edges [][]int) int {    n := len(edges) + 1    degrees := make([]int, n+1)    for _, e := range edges {        degrees[e[0]]++        degrees[e[1]]++    }    for i, d := range degrees {        if d == n-1 {            return i        }    }    return -1}


复杂度分析


  • 时间复杂度:O(n),其中 n 是星型图中的节点数量。需要遍历 n - 1 条边计算每个节点的度,然后遍历 n 个节点寻找中心节点。

  • 空间复杂度:O(n),其中 n 是星型图中的节点数量。需要创建数组存储每个节点的度。



方法二:寻找出现在两条边中的节点

由于只有星型图的中心节点的度是 n - 1,其余每个节点的度都是 1,因此只有星型图在所有的边中都出现,其余每个节点分别只在一条边中出现。


根据星型图的上述性质可知,对于星型图中的任意两条边,星型图的中心节点一定同时在这两条边中出现,其余节点一定不会同时在这两条边中出现。因此,可以任选两条边,然后寻找这两条边的公共节点,该节点即为星型图的中心节点。


具体做法是,选择 edges[0] 和 edges[1] 这两条边,则星型图的中心节点是 edges[0][0] 或者 edges[0][1]。如果 edges[0][0] 和 edges[1] 的两个节点之一相同则 edges[0][0] 是星型图的中心节点,如果 edges[0][0] 和edges[1] 的两个节点都不相同则 edges[0][1] 是星型图的中心节点。


代码

Python3

class Solution:    def findCenter(self, edges: List[List[int]]) -> int:        return edges[0][0if edges[0][0] == edges[1][0or edges[0][0] == edges[1][1else edges[0][1]


Java

class Solution {    public int findCenter(int[][] edges) {        return edges[0][0] == edges[1][0] || edges[0][0] == edges[1][1] ? edges[0][0] : edges[0][1];    }}


C#

public class Solution {    public int FindCenter(int[][] edges) {        return edges[0][0] == edges[1][0] || edges[0][0] == edges[1][1] ? edges[0][0] : edges[0][1];    }}


C++

class Solution {public:    int findCenter(vector<vector<int>>& edges) {        return edges[0][0] == edges[1][0] || edges[0][0] == edges[1][1] ? edges[0][0] : edges[0][1];    }};


C

int findCenter(int** edges, int edgesSize, int* edgesColSize){    return edges[0][0] == edges[1][0] || edges[0][0] == edges[1][1] ? edges[0][0] : edges[0][1];}


JavaScript

var findCenter = function(edges) {    return edges[0][0] === edges[1][0] || edges[0][0] === edges[1][1] ? edges[0][0] : edges[0][1];};


Golang

func findCenter(edges [][]int) int {    if edges[0][0] == edges[1][0] || edges[0][0] == edges[1][1] {        return edges[0][0]    }    return edges[0][1]}


复杂度分析


  • 时间复杂度:O(1)。

  • 空间复杂度:O(1)。



BY / 

本文作者:力扣

编辑&版式:Janson

声明:本文归“力扣”版权所有,如需转载请联系。


点个在看,少个 bug

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
LeetCode 力扣官方题解 | 537. 复数乘法在 VS Code 和 Codium 中编写 Python 程序 | Linux 中国力扣秋招全攻略|刷对题、刷好题、刷出好 Offer投稿延期 | IEEE ICC 2023(IEEE国际通信会议)CODE01 推出后,机械革命计划发布新款 CODE GO 程序员本跨性别选手暴力扣杀,女排球员用脸接球导致脑震荡两周...美国跨性别选手暴力扣杀,女排球员“接球”直接晕倒……缓解干眼一个小办法-热敷眼罩2022年进博会乐高展台重点情报汇总:进博会限定模型图纸、新春套装实物细节详解、上海乐高乐园概念模型全汇总!美国跨性别选手暴力扣杀,女排球员用脸“接球”直接晕倒……IEEE is Your Professional Home - 会员精选视频为你诠释“IEEE如何引领你的专业发展”LeetCode 力扣官方题解 | 917. 仅仅反转字母两株被虫蛀坏的玫瑰活过来了题都白刷了?Amazon导师亲自为你揭秘LeetCode刷题真相!LeetCode 力扣官方题解 | 969. 煎饼排序挑战刷最少的题进大厂!不会刷leetcode的人,救星来了LeetCode刷完200道题,我竟然收到了亚麻的拒信...澳洲191签证开放申请,491/491转PR要求详解!Careers Stalled, China’s Liberal Arts Grads Learn to Code刷力扣题想要做到 Bug Free 需培养怎样的思维?另一种“推翻” VS Code 的尝试:JetBrains Fleet 现开放公测Xcode弃用Bitcode,导致应用体积大幅增加35岁被裁,刷LeetCode变成了自我感动...2022年夏的家园:鹦鹉又来了!商科留学生转码必备:Leetcode到底该怎么刷?与严歌苓的视频交流GitHub疯传!求职亚麻的留学生,请立即停止刷LeetCode!力扣特别策划 | 挑战不可能的运算力扣线上公开课|LeetLive - 登录认证原理与实现Leetcode出题人,揭秘打工体验!程序员必须要掌握的算法技术要点|附赠力扣大厂面试题李大眼:看得见的台湾力扣刷题技巧篇|程序员萌新如何高效刷题LeetCode 力扣官方题解 | 838. 推多米诺vivo新机一英寸大底没跑了,还能数秒拍出星空
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。