持续创作,加速成长!这是我参与「掘金日新计划 · 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不存在任何通往其他地点的交通专线。
示例 2:
输入:
path = [[0,3],[1,0],[1,3],[2,0],[3,0],[3,2]]输出:
-1解释:如下图所示:不存在满足 交通枢纽 的地点。
提示:
1 <= path.length <= 10000 <= path[i][0], path[i][1] <= 1000path[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前端开发,算法业余爱好者,有空会刷刷算法题,平时喜欢打打羽毛球🏸 ,也喜欢写些东西,既为自己记录📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解🙇,写错的地方望指出,定会认真改进😊,在此谢谢大家的支持,我们下文再见🙌。