交通枢纽

113 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情

🎈算法并不一定都是很难的题目,也有很多只是一些代码技巧,多进行一些算法题目的练习,可以帮助我们开阔解题思路,提升我们的逻辑思维能力,也可以将一些算法思维结合到业务代码的编写思考中。简而言之,平时进行的算法习题练习带给我们的好处一定是不少的,所以让我们一起来养成算法练习的习惯。今天练习的题目是一道中等难度的题目 -> 交通枢纽

题目描述

为了缓解「力扣嘉年华」期间的人流压力,组委会在活动期间开设了一些交通专线。path[i] = [a, b] 表示有一条从地点 a通往地点 b 的 单向 交通专线。
若存在一个地点,满足以下要求,我们则称之为 交通枢纽

  • 所有地点(除自身外)均有一条 单向 专线 直接 通往该地点;
  • 该地点不存在任何 通往其他地点 的单向专线。

请返回交通专线的 交通枢纽。若不存在,则返回 -1

注意:

  • 对于任意一个地点,至少被一条专线连通。

示例 1:

输入:path = [[0,1],[0,3],[1,3],[2,0],[2,3]]

输出:3

解释:如下图所示:
地点 0,1,2 各有一条通往地点 3 的交通专线,
且地点 3 不存在任何通往其他地点的交通专线。
image.png

示例 2:

输入:path = [[0,3],[1,0],[1,3],[2,0],[3,0],[3,2]]

输出:-1

解释:如下图所示:不存在满足 交通枢纽 的地点。
image.png

提示:

  • 1 <= path.length <= 1000
  • 0 <= path[i][0], path[i][1] <= 1000
  • path[i][0] 与 path[i][1] 不相等

思路分析

首先我们要先理解一下题目的意思,题目会给我们一个数组,数组中有若干个数组,每个数组包含两个元素,两个元素代表两个地点,这个数组则表示这两个地点之间有一条道路连通。现在我们需要找到一个一个地点,我们称之为 交通枢纽,它需要满足以下要求:

  • 所有地点(除自身外)均有一条 单向 专线 直接 通往该地点;
  • 该地点不存在任何 通往其他地点 的单向专线。

所以我们可以根据交通枢纽的这两个特点来入手解题:

  • 1、计算地点个数
int len = 0;
for (int i = 0; i < path.length; i++) {
    len = Math.max(len,path[i][0]);
    len = Math.max(len,path[i][1]);
    ……
}
  • 2、统计每个地点的出度入度
Map<Integer, Integer> map1 = new HashMap<Integer, Integer>();
Map<Integer, Integer> map2 = new HashMap<Integer, Integer>();
int len = 0;
for (int i = 0; i < path.length; i++) {
    ……
    int c = path[i][0];
    int frequency = map1.getOrDefault(c, 0) + 1;
    map1.put(c, frequency);
    int c1 = path[i][1];
    int frequency1 = map2.getOrDefault(c1, 0) + 1;
    map2.put(c1, frequency1);
}
  • 3、找到满足条件的交通枢纽
for (Map.Entry<Integer, Integer> entry : map2.entrySet()) {
    if(!map1.containsKey(entry.getKey())){
        if(entry.getValue() == len) return entry.getKey();
    }
}

完整AC代码如下:

AC代码

class Solution {
    public int transportationHub(int[][] path) {
        Map<Integer, Integer> map1 = new HashMap<Integer, Integer>();
        Map<Integer, Integer> map2 = new HashMap<Integer, Integer>();
        int len = 0;
        for (int i = 0; i < path.length; i++) {
            len = Math.max(len,path[i][0]);
            len = Math.max(len,path[i][1]);
            int c = path[i][0];
            int frequency = map1.getOrDefault(c, 0) + 1;
            map1.put(c, frequency);
            int c1 = path[i][1];
            int frequency1 = map2.getOrDefault(c1, 0) + 1;
            map2.put(c1, frequency1);
        }
        for (Map.Entry<Integer, Integer> entry : map2.entrySet()) {
            if(!map1.containsKey(entry.getKey())){
                if(entry.getValue() == len) return entry.getKey();
            }
        }
        return -1;
    }
}

说在后面

🎉这里是JYeontu,喜欢算法,GDCPC打过卡;热爱羽毛球,大运会打过酱油。毕业一年,两年前端开发经验,目前担任H5前端开发,算法业余爱好者,有空会刷刷算法题,平时喜欢打打羽毛球🏸 ,也喜欢写些东西,既为自己记录📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解🙇,写错的地方望指出,定会认真改进😊,在此谢谢大家的支持,我们下文再见🙌。