815. Bus Routes

输入:int[][] routes routes[i]表示第i号公交车的运行线路。如果routes[i]={1,3,5}。说明公交车运行线路是1->3->5。
   int S:表示起始站点
   int T:表示目的站点
输出:从S到T最少需要几辆公交车。
规则:一开始人没有坐在公交车上,出行方式只用公交车。
分析:很自然的想到以各个站点为节点,站点之间从上一站到下一站作为线。每个站点添加个list维护这个站点属于哪些公交车。
 这样的想法很自然,很惯性,确没有什么用。因为要找的是公交车数量的最小值,所以应该重点关注如何从一个公交车跳转到另外一个公交车。直到调到包含T的公交车上。
学习1:官方的solution
 把公交车看做是图的节点。要返回最少的公交车数量,就是一个最短路径问题。
 如果两个公交车至少有一个站是相同的,那这两个公交车之间有连线。
 从起始站开始BFS遍历图,直到遇到目标站。
 一个站可能在多个公交车里面有,所以起始队列和终点目标都是多个的。
 这里发现BFS总能解决最短路径问题。;例如847,也是最短路径,也用了BFS。

public int numBusesToDestination(int[][] routes, int S, int T) {//构建图Map<Integer, List<Integer>> graph = new HashMap<Integer,List<Integer>>();int N = routes.length;for(int i=0;i<N;i++){Arrays.sort(routes[i]);graph.put(i,new ArrayList<Integer>());}for(int i=0;i<N;i++){for(int j = i+1;j<N;j++){if(intersection(routes[i],routes[j])){graph.get(i).add(j);graph.get(j).add(i);}}}//遍历Queue<Point> queue = new ArrayDeque<>();Set<Integer> seen = new HashSet<>();List<Integer> targets = new ArrayList<>();for(int i=0;i<N;i++){if(Arrays.binarySearch(routes[i],S)!=-1){queue.offer(new Point(i,0));seen.add(i);}if(Arrays.binarySearch(routes[i],T)!=-1){targets.add(i);}}while(!queue.isEmpty()){Point point = queue.poll();int node = point.x;int depth = point.y;if(targets.contains(node)){return depth+1;}else{for(Integer next : graph.get(node)){if(!seen.contains(next)){seen.add(next);queue.offer(new Point(next,depth+1));}}}}return -1;}/*** 判断两个数组是否有交集* @param a* @param b* @return*/private boolean intersection(int[] a,int[] b) {int i = 0;int j = 0;while(i<a.length && j<b.length){if(a[i]==b[j]) return true;if(a[i]<b[j]){i++;}else{j++;}}return false;}

学习2:如果把公交站点看做图中的节点也是可以的。但是不是以公交车的线路作为连线的。而是一次访问了一辆公交车上所有的站点。理解起来不如上面的解法。

/*** https://leetcode.com/problems/bus-routes/discuss/122712/Simple-Java-Solution-using-BFS* 我一定认为要按照公交车的行驶顺利遍历站点。* 如果roets[0]={1,5,7},如果从5开始,那么1,7可以同时加入队列,因为只要在这辆公交车内不管走多少遍,都是1辆公交车。题目需求求解的也是最少公交车数量,不是站点数量。* @param routes* @param S* @param T* @return*/public int numBusesToDestination(int[][] routes, int S, int T) {if(S==T) return 0;Map<Integer,List<Integer>> map = new HashMap<Integer, List<Integer>>();for(int i=0;i<routes.length;i++){for(int j=0;j<routes[i].length;j++){List<Integer> busList = map.getOrDefault(routes[i][j],new ArrayList<>());busList.add(i);map.put(routes[i][j],busList);}}Queue<Integer> queue = new ArrayDeque<>();queue.offer(S);Set<Integer> seen = new HashSet<>();int level = 0;while(!queue.isEmpty()){int size = queue.size();level++;for(int i=0;i<size;i++){int stop = queue.poll();if(stop == T) return level;for(int bus : map.get(stop)){if(seen.contains(bus)) continue;seen.add(bus);for(int j=0;j<routes[bus].length;j++){queue.offer(routes[bus][j]);}}}}return -1;}

代码1

代码2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/424656.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第三十三期:连接池中非常关键的两个参数,到底是干啥用的?

说来惭愧&#xff0c;从事互联网开发好些年了&#xff0c;有些概念一直没有彻底搞清楚。其中之一就是,ttp client配置连接池的时候,maxConnectionsPerHost,和maxTotalConnections,在网上搜了一圈&#xff0c;发现很多都讲的含含糊糊的。 作者&#xff1a;资深开发讲技术 背景 …

一个密码经过多次MD5加密能否提高安全性?Java MD5盐值加解密

什么是MD5? MD5&#xff08;Message Digest Algorithm 5&#xff0c;信息摘要算法5&#xff09;&#xff0c;是计算机广泛使用的摘要算法&#xff08;又称哈希算法&#xff09;之一。MD5是将一段信息&#xff0c;通过其不可逆的字符串变换算法&#xff0c;产生了唯一的MD5信息…

[Leetcode][第24题][JAVA][两两交还的链表中的节点][递归][三指针]

【问题描述】[中等] 【解答思路】 1. 递归 时间复杂度&#xff1a;O(N) 空间复杂度&#xff1a;O(N) class Solution {public ListNode swapPairs(ListNode head) {if(head null || head.next null){return head;}ListNode next head.next;head.next swapPairs(next.next…

301. Remove Invalid Parentheses

目录题目描述回溯法有效剪枝&#xff0c;速度更快回溯法改进题目描述 输入&#xff1a;一个字符串&#xff0c;包含(,)&#xff0c;还有一些其他字符。 输出&#xff1a;左右括号完全匹配的字符串。并且要尽可能少的删除字符。 规则&#xff1a;有左括号&#xff0c;有对应的右…

第三十四期:花了一个星期,我终于把RPC框架整明白了!

RPC(Remote Procedure Call)&#xff1a;远程过程调用&#xff0c;它是一种通过网络从远程计算机程序上请求服务&#xff0c;而不需要了解底层网络技术的思想。 作者&#xff1a;李金葵 RPC(Remote Procedure Call)&#xff1a;远程过程调用&#xff0c;它是一种通过网络从远…

win7NVIDIA显卡驱动升级时卡住

可以先装上.NET framework&#xff0c;再更新就不会卡了转载于:https://www.cnblogs.com/haizine/p/10950442.html

[Leetcode][第116 117题][JAVA][填充每个节点的下一个右侧节点指针][BFS][链表前驱节点]

【问题描述】[中等] 【解答思路】 1. BFS层次遍历思想 &#xff08;通用&#xff09; 时间复杂度&#xff1a;O(N) 空间复杂度&#xff1a;O(N) public Node connect(Node root) {if (root null)return root;Queue<Node> queue new LinkedList<>();queue.add(r…

Windows Server2012 R2 无法安装.NET Framework 3.5的解决方法

Windows server 2012R2&#xff0c;自带的是.NET Framework 4.5,如果想装SQL server2008或者SQL server2012就需要安装 .ENT Framework 3.5或者2.0的版本&#xff0c;建议安装 .NET3.5 版本&#xff0c;我本人亲测过&#xff0c;成功了&#xff01; 安装不成功错误分析&#x…

第三十五期:网络爬虫是啥玩意儿?有什么用呢?

在这个用数据说话的时代&#xff0c;数据是一件极其重要的事情&#xff0c;怎样才能抓取到完整以及全面的数据呢&#xff1f;这并不是一件容易的事情。 作者&#xff1a;呦呦科学馆 如果想要做好大数据的分析&#xff0c;单单依靠一己之力或者是周边的数据是远远不够的&#x…

121 Best Time to Buy and Sell Stock

输入&#xff1a;一个数组prices,prices[i]表示第i天股票的价格。 输出&#xff1a;买卖股票的最大收益。 规则&#xff1a;只允许最多买一次&#xff0c;最多卖一次股票。如果觉得价格不合适&#xff0c;可以不买卖。 分析1&#xff1a;最先想到的是暴力搜索&#xff0c;每天都…

第三十六期:学 Java 网络爬虫,需要哪些基础知识?

说起网络爬虫&#xff0c;大家想起的估计都是 Python &#xff0c;诚然爬虫已经是 Python 的代名词之一&#xff0c;相比 Java 来说就要逊色不少。有不少人都不知道 Java 可以做网络爬虫&#xff0c;其实 Java 也能做网络爬虫而且还能做的非常好&#xff0c;在开源社区中有不少…

前端之盒子模型

CSS之盒子模型 margin: 用于控制元素与元素之间的距离&#xff1b;margin的最基本用途就是控制元素周围空间的间隔&#xff0c;从视觉角度上达到相互隔开的目的。padding: 用于控制内容与边框之间的距离&#xff1b;Border(边框): 围绕在内边距和内容外的边框。Content(内容): …

[Leetcode][第977题][JAVA][有序数组的平方][排序][双指针]

【问题描述】[简单] 【解答思路】 1. 排序 平方后排序 没有使用排序的特性 时间复杂度&#xff1a;O(NlogN) 空间复杂度&#xff1a;O(1) class Solution {public int[] sortedSquares(int[] A) {int[] ans new int[A.length];for (int i 0; i < A.length; i) {ans[i] …

开始《数据机构与算法之美》之旅

文章出处&#xff1a;极客时间《数据结构和算法之美》-作者&#xff1a;王争。该系列文章是本人的学习笔记。 还在学算法&#xff0c;就像还在学英语一样悲催。想想自己为什么要学算法。学&#xff0c;是为了用。学了&#xff0c;能理解Java API提供的接口和数据结构的实现方式…

第三十七期:为什么2019年人工智能算法岗求职竞争如此激烈?

在各公司全面数据化智能化的当下&#xff0c;算法岗本该更受青睐&#xff0c;为何突然成了就业重灾区?除了暴力劝退&#xff0c;本文将从几个不同角度来分析当前算法岗的求职就业情况。 作者&#xff1a;皮皮鲁的AI星球 与前几年媒体报道的人工智能毕业生高薪难求形成鲜明对比…

[LeetCode] 141. Linked List Cycle 单链表判圆算法

TWO POINTER 快指针速度2 &#xff0c; 慢指针速度1 相对速度1&#xff0c;有环必然相遇 public class Solution {public boolean hasCycle(ListNode head) {ListNode fast head,slow head;while(fast!null && fast.next!null){slow slow.next;fast fast.next.next…

[Bugku][Web][CTF] 9-15 write up

【说明】 整合资源 简略版本2020Bugku write up Bugku Web第九题 关键字 &#xff1a;/?argsGLOBALS PHP 将所有全局变量存储在一个名为 $GLOBALS[index] 的数组中。 index 保存变量的名称。这个数组可以在函数内部访问&#xff0c;也可以直接用来更新全局变量。 Web 第十题…

第三十八期:用Git帮助写作者更好地完成工作

如果你是一名写作者&#xff0c;你也能从使用 Git 中受益。在我们的系列文章中了解有关 Git 鲜为人知的用法。 作者&#xff1a;佚名 如果你是一名写作者&#xff0c;你也能从使用 Git 中受益。在我们的系列文章中了解有关 Git 鲜为人知的用法。 Git 是一个少有的能将如此多的…

报错

报错 报错&#xff1a; 2019-05-31 11:38:42.645 WARN 18756 --- [nio-8080-exec-1] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotWritableException: No converter found for return value of type: class net.a…

[Bugku][Web][CTF] 16-29 write up

【说明】 整合资源 简略版本2020Bugku write up web16 备份是个好习惯 /index.php.bak 查看php代码 1.因为md5&#xff08;&#xff09;函数加密不能处理数组&#xff0c;则key1和key2的返回值为空&#xff0c;即可获得flag http://123.206.87.240:8002/web16/?kkeyey1[]1&am…