BFS經典應用 最精簡公車路線搭乘次數 Bus Routes_Leetcode #815

閱讀時間約 6 分鐘
raw-image

這題的題目在這裡:Bus Routes

題目敘述

題目會給我們一個routes 陣列,裡面都是分別代表每一條公車路線所對應的公車站編號。

題目要求我們計算出,從起點站source到終點站target的最精簡公車路線搭乘次數是幾次?

也就是說,就是在最少轉乘的前提下,旅途中需要搭乘幾條公車路線?

如果無法抵達,則返回-1


測試範例

Example 1:

Input: routes = [[1,2,7],[3,6,7]], source = 1, target = 6
Output: 2
Explanation: The best strategy is take the first bus to the bus stop 7, then take the second bus to the bus stop 6.

Example 2:

Input: routes = [[7,12],[4,5,15],[6],[15,19],[9,12,13]], source = 15, target = 12
Output: -1

約束條件

Constraints:

  • 1 <= routes.length <= 500.
  • 1 <= routes[i].length <= 10^5
  • All the values of routes[i] are unique.
  • sum(routes[i].length) <= 10^5
  • 0 <= routes[i][j] < 10^6
  • 0 <= source, target < 10^6

演算法

raw-image

這一題可以用圖論的最短路徑演算法來解題。

怎麼說呢?

可以把同一條路線上的公車站都是為同一個虛擬節點

公車路線#0 整個視為一體,視為虛擬節點0。

公車路線#1 整個視為一體,視為虛擬節點1。

...

其餘依此類推

當兩條公車路線有交會在某個公車站時,則兩個虛擬節點有一條邊相連,成本為1,對應到一次轉乘,也就是多一次乘車次數。

raw-image

因為每次轉乘的成本都相同,都是累加次數一次,所以這裡可以使用BFS廣度優先演算法來找最小公車路線搭乘次數。

以起點為出發點,搭乘次數為0次,每踏上一條新的公車路線,路線搭乘次數就+1。

以搭乘公車路線的總次數為層數,由內而外,從1層往外擴散到2層、第3層...依此類推

BFS迭代中,當公車站牌為終點時,此時的擴散層數就是最小公車路線搭乘次數。

BFS迭代結束後,若仍無法抵達終點,則返回-1,代表無解。


程式碼

class Solution:
 def numBusesToDestination(self, routes: List[List[int]], source: int, target: int) -> int:
  
  if source == target:
   # Quick response to simple case
   # No need to take bus if source is equal to target
   return 0

  # key: bus_stop
  # value: busline to corresponding bus_stop
  bus_info = defaultdict(list)

  for busline, route in enumerate(routes):
   for bus_stop in route:
    bus_info[bus_stop].append(busline)
    
  travel_queue = deque( [(source, 0)] )
  visited = set([source])
  bus_line_considered = set()

  # Find shortest bus transfer count from Source to Target
  while travel_queue:
   
   cur_bus_stop, get_on_bus_count = travel_queue.popleft()

   if cur_bus_stop == target: return get_on_bus_count

   for busline in bus_info[cur_bus_stop]:
    
    if busline in bus_line_considered:
     continue

    for other_bus_stop in routes[busline]:
     if other_bus_stop not in visited:
      travel_queue.append((other_bus_stop, get_on_bus_count + 1))
      visited.add(other_bus_stop)
    
    # This busline has been considered, clear to empty to avoid repetition
    #routes[busline] = []
    bus_line_considered.add(busline)

  return -1

複雜度分析

時間複雜度:

最差情況,發生在每個車站都被每條路線包含。

此時建表bus_info的時間成本最大,需耗費O( bus stop count * bust line count)

空間複雜度:

最差情況,發生在每個車站都被每條路線包含。

此時建表bus_info的空間成本最大,需耗費O( bus stop count * bust line count)


關鍵知識點

可以把同一條路線上的公車站都是為同一個虛擬節點

當兩條公車路線有交會在某個公車站時,則兩個虛擬節點有一條邊相連,成本為1,對應到一次轉乘,也就是多一次乘車次數。

因為每次轉乘的成本都相同,都是累加次數一次,所以這裡可以使用BFS廣度優先演算法來找最小公車路線搭乘次數。


Reference:

[1] Python O(m*n) by BFS [+ Visualization] - Bus Routes - LeetCode

80會員
417Content count
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
題目會給我們一個pair陣列,裡面都是原本陣列相鄰元素形成的pair,順序已經被打散。 要求我們從pair陣列重建出原本的陣列。 答案可能有不只一組,任選一組回傳即可。
題目會給定我們兩個點座標,分別是起點和終點。 另外,還有一個參數t,代表時間限制。 從起點出發之後,每一秒鐘,我們必須選擇一個N8 8連通的方向,往鄰居的格子點移動。(題目有特別強調,每一秒必須強制移動到下一個格子點,不能停留在原地) 請問我們能不能在時間限制內,從起點走到終點?
題目會給一顆二元樹,要求我們計算節點值 和 子樹平均值相等的node有幾個。
題目會給我們一顆二元樹的根結點,要求我們找出每一層最大的節點值。
題目會給我們節點總數目n、左子樹的關係陣列、右子樹的關係陣列,要求我們驗證在給定的條件下,能不能構成一顆合法的二元樹。
題目會給我們兩條已經從小到大排序好的串列,要求我們依照從小到大的順序,合併這兩條串列。
題目會給我們一個pair陣列,裡面都是原本陣列相鄰元素形成的pair,順序已經被打散。 要求我們從pair陣列重建出原本的陣列。 答案可能有不只一組,任選一組回傳即可。
題目會給定我們兩個點座標,分別是起點和終點。 另外,還有一個參數t,代表時間限制。 從起點出發之後,每一秒鐘,我們必須選擇一個N8 8連通的方向,往鄰居的格子點移動。(題目有特別強調,每一秒必須強制移動到下一個格子點,不能停留在原地) 請問我們能不能在時間限制內,從起點走到終點?
題目會給一顆二元樹,要求我們計算節點值 和 子樹平均值相等的node有幾個。
題目會給我們一顆二元樹的根結點,要求我們找出每一層最大的節點值。
題目會給我們節點總數目n、左子樹的關係陣列、右子樹的關係陣列,要求我們驗證在給定的條件下,能不能構成一顆合法的二元樹。
題目會給我們兩條已經從小到大排序好的串列,要求我們依照從小到大的順序,合併這兩條串列。
你可能也想看
Thumbnail
1.加權指數與櫃買指數 週五的加權指數在非農就業數據開出來後,雖稍微低於預期,但指數仍向上噴出,在美股開盤後於21500形成一個爆量假突破後急轉直下,就一路收至最低。 台股方面走勢需觀察週一在斷頭潮出現後,週二或週三開始有無買單進場支撐,在沒有明確的反轉訊號形成前,小夥伴盡量不要貿然抄底,或是追空
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
歐美碩博士班學生,若能秒解且靈活運用ddraconian legislation、draconian policy、draconian penalty、draconian restriction、draconian sentence於高階寫作中,已達高階英文「思、辨、達」境界。
Thumbnail
企業管理策略能促進團隊合作協調,並激發其動力和創造力。本文提供重點精華及我的應用提案,幫助企業建立高效的團隊和實現持續性成功。包含:企業擴展階段、團隊目標制定、遊戲角色分配、組織圖建立、書面溝通之重要、統計值的應用、擬訂計畫的方法、協調團隊的技巧等,以及會議和財務計畫的重要性。
Thumbnail
亨利凱洛的《偉大攝影的基礎》系列總共有《偉大攝影的基礎》、《偉大攝影的基礎:風景》、《偉大攝影的基礎:人像》等3本書,共通點都是透過50位攝影大師的作品搭配文字說明講解概念,文字量少而淺白,可以說沒有什麼太過複雜而難解的專有名詞或內容,滿適合對於操作相機已經有基礎概念的人閱讀。
Thumbnail
撰寫日期:2022.09.02 作者:FAHAHA|翁順法 這篇文章介紹了SCQA這個表達框架,能夠幫助你更有效的組織內容,並在開頭吸引聽眾的興趣。 在使用框架時,應該避免被框架限制,也不要被框架的變形嚇到,掌握聽眾的狀態、意願、問題、需求,並視情況變化,才是真正聰明的表達者。
Thumbnail
Pump Room 餐廳落成於18世紀,一腳踏進歷史場景,我非常喜歡的《傲慢與偏見》作家珍‧奧斯汀也鍾情此地,她的兩部小說都出現過這棟古典華美的建築。
Thumbnail
〔薩滿課程-推薦書/重點筆記〕魔藥調製聖典與現代應用指南:神秘學大師親授薰香、精油、花草精 【Genius讀後感】 這是一個神奇的魔法世界,有許多讓人大開眼界的思維領域,裡面詳細的紀錄調配的過程與配方,藥草魔法是運用植物力量的一種特殊方法。這就是薰香、精油、沐浴鹽、藥水和花草精所涉及的範疇。 藥草魔
Thumbnail
我相信人們不分男女老少,都喜歡聽童話故事和民間傳說。在聽故事的過程中,我們將自己融入充滿奇想的情境中,並用奇蹟般的方式找到出路。而我們的先祖,述說故事的人,將他們的經驗化為口耳相傳的故事,讓深陷於相同困境的我們,能夠從故事中找到富有想像力的解決之道。
Thumbnail
其實我很好奇,當大家都在欣賞工讀生精湛的演出時 占了這麼好的位置的你,卻在拍攝? #工讀生很難過 #他需要鎂光燈 多羅滿賞鯨 電話:03-8333821  line@:@xvi3160b  http://www.turumoan.com.tw . #Hualien  #Taiwan  #wee
Thumbnail
產品經理的面試一般都會問哪些問題呢?綜合我自己的招聘經驗,我覺得產品經理面試基本上就是針對個人潛力、通用能力、專業能力三大方面評量,會想了解……
Thumbnail
  近期台灣政治的烽火總會掃到女性身上。似乎在評論女性的工作能力之前,還需要先檢視女性是否有完成家庭與社會責任,其他的個人成就不值一提。是時候看看上個世紀的女性主義文章,如何回應相關的質疑。
Thumbnail
1.加權指數與櫃買指數 週五的加權指數在非農就業數據開出來後,雖稍微低於預期,但指數仍向上噴出,在美股開盤後於21500形成一個爆量假突破後急轉直下,就一路收至最低。 台股方面走勢需觀察週一在斷頭潮出現後,週二或週三開始有無買單進場支撐,在沒有明確的反轉訊號形成前,小夥伴盡量不要貿然抄底,或是追空
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
歐美碩博士班學生,若能秒解且靈活運用ddraconian legislation、draconian policy、draconian penalty、draconian restriction、draconian sentence於高階寫作中,已達高階英文「思、辨、達」境界。
Thumbnail
企業管理策略能促進團隊合作協調,並激發其動力和創造力。本文提供重點精華及我的應用提案,幫助企業建立高效的團隊和實現持續性成功。包含:企業擴展階段、團隊目標制定、遊戲角色分配、組織圖建立、書面溝通之重要、統計值的應用、擬訂計畫的方法、協調團隊的技巧等,以及會議和財務計畫的重要性。
Thumbnail
亨利凱洛的《偉大攝影的基礎》系列總共有《偉大攝影的基礎》、《偉大攝影的基礎:風景》、《偉大攝影的基礎:人像》等3本書,共通點都是透過50位攝影大師的作品搭配文字說明講解概念,文字量少而淺白,可以說沒有什麼太過複雜而難解的專有名詞或內容,滿適合對於操作相機已經有基礎概念的人閱讀。
Thumbnail
撰寫日期:2022.09.02 作者:FAHAHA|翁順法 這篇文章介紹了SCQA這個表達框架,能夠幫助你更有效的組織內容,並在開頭吸引聽眾的興趣。 在使用框架時,應該避免被框架限制,也不要被框架的變形嚇到,掌握聽眾的狀態、意願、問題、需求,並視情況變化,才是真正聰明的表達者。
Thumbnail
Pump Room 餐廳落成於18世紀,一腳踏進歷史場景,我非常喜歡的《傲慢與偏見》作家珍‧奧斯汀也鍾情此地,她的兩部小說都出現過這棟古典華美的建築。
Thumbnail
〔薩滿課程-推薦書/重點筆記〕魔藥調製聖典與現代應用指南:神秘學大師親授薰香、精油、花草精 【Genius讀後感】 這是一個神奇的魔法世界,有許多讓人大開眼界的思維領域,裡面詳細的紀錄調配的過程與配方,藥草魔法是運用植物力量的一種特殊方法。這就是薰香、精油、沐浴鹽、藥水和花草精所涉及的範疇。 藥草魔
Thumbnail
我相信人們不分男女老少,都喜歡聽童話故事和民間傳說。在聽故事的過程中,我們將自己融入充滿奇想的情境中,並用奇蹟般的方式找到出路。而我們的先祖,述說故事的人,將他們的經驗化為口耳相傳的故事,讓深陷於相同困境的我們,能夠從故事中找到富有想像力的解決之道。
Thumbnail
其實我很好奇,當大家都在欣賞工讀生精湛的演出時 占了這麼好的位置的你,卻在拍攝? #工讀生很難過 #他需要鎂光燈 多羅滿賞鯨 電話:03-8333821  line@:@xvi3160b  http://www.turumoan.com.tw . #Hualien  #Taiwan  #wee
Thumbnail
產品經理的面試一般都會問哪些問題呢?綜合我自己的招聘經驗,我覺得產品經理面試基本上就是針對個人潛力、通用能力、專業能力三大方面評量,會想了解……
Thumbnail
  近期台灣政治的烽火總會掃到女性身上。似乎在評論女性的工作能力之前,還需要先檢視女性是否有完成家庭與社會責任,其他的個人成就不值一提。是時候看看上個世紀的女性主義文章,如何回應相關的質疑。