815. Bus Routes
生活随笔
收集整理的這篇文章主要介紹了
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。
學習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
總結
以上是生活随笔為你收集整理的815. Bus Routes的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【数据结构与算法】平衡二叉树、红黑树
- 下一篇: LeetCode 答案(Easy)(60