最短路徑應用: 遊戲模擬 Jump Game IV 青蛙過河 IV_Leetcode_#1345

閱讀時間約 8 分鐘

題目敘述

題目會給我們一個輸入陣列arr,起始點固定在索引為0的位置,
終點固定在索引為n-1的位置

假設當下所在的索引位置為i,那麼每次移動的時候,可以跳到i-1i+1,或者其他和我有相同元素值的位置arr[j], where arr[j] = arr[i]。

例如:

假設當下在i=3的位置,arr[i] = 5,那麼下一步可以跳到i-1=2 或者i+1=4,或者陣列上其他陣列元素值=5的位置。


請問,從起點0出發跳到終點n-1,所需要的最小跳躍次數為多少?


題目的原文敘述


測試範例

Example 1:

Input: arr = [100,-23,-23,404,100,23,23,23,3,404]
Output: 3
Explanation: You need three jumps from index 0 --> 4 --> 3 --> 9. Note that index 9 is the last index of the array.

arr[0] 跳到 arr[4],因為兩者的元素值相同,都是100
arr[4] 跳到 arr[3]3 = 4-1 是相差一隔的鄰居​
arr[3] 跳到 arr[9],因為兩者的元素值相同,都是404

Example 2:

Input: arr = [7]
Output: 0
Explanation: Start index is the last index. You do not need to jump.

起點剛好等於終點,不用跳就已經抵達終點。
所以0次。​

Example 3:

Input: arr = [7,6,9,6,9,6,9,7]
Output: 1
Explanation: You can jump directly from index 0 to index 7 which is last index of the array.

arr[0] 可以直接跳到 arr[7],因為兩者的元素值相同,都是7

約束條件

Constraints:

  • 1 <= arr.length <= 5 * 10^4

陣列長度界於1~五萬之間。

  • -10^8 <= arr[i] <= 10^8

每個陣列元素值界於 負一億~正一億 之間。


演算法

題目已經無形中保證一定有解,為什麼?

因為最差情況下,就是每次都從i往右跳一格到i+1,總有一步會抵達終點n-1。

但是,題目要問的是從起點0到終點n-1的最短路徑需要幾次跳躍?


抽象的想,可以把arr[i]每個陣列格子都視為一個節點

然後 arr[i] 和 arr[i-1], arr[i+1]各有一條邊相連成本為1

假如arr[j] = arr[i] 元素值相等,arr[i] 也和其他的arr[j] 有邊相連成本為1


到這裡,就把原本跳躍次數的問題,轉化成圖論中的最短路徑搜索問題
起點為Node 0,終點為 n-1,最少要經過幾條邊(相當於幾次跳躍)才能抵達。


無權重的圖 或者 權重都相等的圖中尋找最短路徑,那很自然就會想到BFS先天具有點播源擴散的特質,也因此具有最短路徑的搜索性質


我們只要從Node 0 開始進行BFS廣度優先搜尋,一層一層往外拜訪,
當拜訪到Node n-1的時候,
當下的步數 = 最短路徑長度 = 從起點到終點的最小跳躍次數


程式碼 BFS先天在無權圖 或者 等權圖 具有最短路徑的特質

class Solution:
def minJumps(self, arr):

n = len(arr)
destination = n-1

## Dictionary: a group of the same number
# key: number
# value: idx of number
same_number = defaultdict(list)

for idx, number in enumerate(arr):
same_number[number].append(idx)

# src = 0, step = 0
bfs_q = deque([(0, 0)])

# visited set
seen = set([0])

# Launch BFS from starting index = 0
# BFS naturaly has shortest path from source to destination.
while bfs_q:

cur, step = bfs_q.popleft()

# Reach destination
if cur == destination:
return step

# Go to the neighbor to previous index as well as next index
for next_idx in (cur+1, cur-1):
if 0 <= next_idx < n and next_idx not in seen:
bfs_q.append( (next_idx, step+1) )
seen.add( next_idx )

# Go to friend index who has the same number with me
for next_idx in same_number[ arr[cur] ]:
if next_idx not in seen:
bfs_q.append( (next_idx, step+1) )
seen.add( next_idx )

# Avoid repeated redundant traversal which would not yield better result
del same_number[ arr[cur] ]


return -1

複雜度分析 BFS先天在無權圖 或者 等權圖 具有最短路徑的特質

令n=輸入陣列nums的長度 = 圖中的節點總數

時間複雜度:

從start拜訪整張圖,每個節點至多訪問一次,每個節點至少有兩條向外的指向邊。

最後一定能找到最短路徑(因為最差情況就是每次都往右走,總有一步會走到終點)。

拜訪整張圖所需時間為O(n)。


空間複雜度:

起點開始BFS逐層搜索每一層拜訪彼此相差一步的節點,最大長度為O(n)。


關鍵知識點

無權重的圖 或者 權重都相等的圖中尋找最短路徑,那很自然就會想到BFS先天具有點播源擴散的特質,也因此具有最短路徑的搜索性質


我們只要從Node 0 開始進行BFS廣度優先搜尋,一層一層往外拜訪,

當拜訪到Node n-1的時候,

當下的步數 = 最短路徑長度 = 從起點到終點的最小跳躍次數


這邊也整理了一些常用的BFS、DFS圖論中的應用場景,提供讀者作為參考。


Reference:

[1] Jump Game IV_Python O(n) by BFS with natural shortest path itself [w/ Comment]

88會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
題目敘述 題目會給我們一個輸入陣列nums,每個元素值代表那個格子點可以左右位移的固定長度。 例如,假設 nums[i] = 3,那麼下一步可以移動到nums[i-3] 或 nums[i+3]這兩個格子點。 題目​會給定一個起始點start索引位置,請問我們能不能走到內部數值為0的格子點?
題目敘述 題目會給我們一個輸入陣列nums,每個元素值代表那個格子點可以跳躍的最大長度。 題目保證始從最左邊的格子點出發開始跳,一定可以成功抵達終點,請問最少跳躍次數是說少? 題目的原文敘述 測試範例 Example 1: Input: nums = [2,3,1,1,4] Outp
題目敘述 題目會給我們一個輸入陣列nums,每個元素值代表那個格子點可以跳躍的最大長度。 一開始從最左邊的格子點出發開始跳,請問可以成功抵達終點,也就是最右邊的格子點嗎? 如果可以,返回 True。 如果不行,返回False。 題目的原文敘述 測試範例 Example 1: In
題目敘述 題目會給我們一個房間陣列rooms,每個房間裡面擁有數量不等,可以打開其他房間的鑰匙。 每一道房間門預設都是鎖住的,只有0號房間的門一開始是打開的。 請問,從0號房間開始拿鑰匙,最終能不能打開所有房間的門? 題目的原文敘述 測試範例
題目敘述 題目會給我們一顆二元樹的根結點,請我們列出每一層最右邊的節點值,以陣列的形式返回答案。 題目的原文敘述 測試範例 Example 1: Input: root = [1,2,3,null,5,null,4] Output: [1,3,4] 每一層最右邊的節點值分別是1, 3,
題目敘述 題目會給定我們一個字串s,和一組字庫wordDict。 問我們能不能透過字串串接的方式,從字庫裡面的字拼成原本的字串s? 可以的話,返回True。 無解的話,返回False。 註: 題目還允許重複使用字庫裡面的字去串接。
題目敘述 題目會給我們一個輸入陣列nums,每個元素值代表那個格子點可以左右位移的固定長度。 例如,假設 nums[i] = 3,那麼下一步可以移動到nums[i-3] 或 nums[i+3]這兩個格子點。 題目​會給定一個起始點start索引位置,請問我們能不能走到內部數值為0的格子點?
題目敘述 題目會給我們一個輸入陣列nums,每個元素值代表那個格子點可以跳躍的最大長度。 題目保證始從最左邊的格子點出發開始跳,一定可以成功抵達終點,請問最少跳躍次數是說少? 題目的原文敘述 測試範例 Example 1: Input: nums = [2,3,1,1,4] Outp
題目敘述 題目會給我們一個輸入陣列nums,每個元素值代表那個格子點可以跳躍的最大長度。 一開始從最左邊的格子點出發開始跳,請問可以成功抵達終點,也就是最右邊的格子點嗎? 如果可以,返回 True。 如果不行,返回False。 題目的原文敘述 測試範例 Example 1: In
題目敘述 題目會給我們一個房間陣列rooms,每個房間裡面擁有數量不等,可以打開其他房間的鑰匙。 每一道房間門預設都是鎖住的,只有0號房間的門一開始是打開的。 請問,從0號房間開始拿鑰匙,最終能不能打開所有房間的門? 題目的原文敘述 測試範例
題目敘述 題目會給我們一顆二元樹的根結點,請我們列出每一層最右邊的節點值,以陣列的形式返回答案。 題目的原文敘述 測試範例 Example 1: Input: root = [1,2,3,null,5,null,4] Output: [1,3,4] 每一層最右邊的節點值分別是1, 3,
題目敘述 題目會給定我們一個字串s,和一組字庫wordDict。 問我們能不能透過字串串接的方式,從字庫裡面的字拼成原本的字串s? 可以的話,返回True。 無解的話,返回False。 註: 題目還允許重複使用字庫裡面的字去串接。
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
“最終誰是最大贏家?” 最終托斯(Aoy的投資方)取得了最大利益,因為Aoy從始至終就是他打造出來的搖錢樹,沒了保羅競爭他可以賺取更多的錢跟獲得更大的影響力(權力) “權力鬥爭是資方獲取最大利益的棋局”
Thumbnail
" Sometimes it's the people you least expect who do the most incredible thing. " 有時候正是那些最意想不到的人, 才能做出最超出想象的事。 - 出自電影-模仿遊戲🔍 有些人平時毫不張揚 甚至有些不起眼 但是一做事卻
Thumbnail
  有些情你會偶爾想起它,可能是湊巧翻開相冊裡的合影,曾經一起去看過的電影院,又或者是不經意間擦身而過的情侶。那些都會令你想起某個他,也許你已經記不起他的長相、他的聲音、他的姓名,但是只要有人提起關於他的近況。   「你們還有聯繫嗎?」友人問。
Thumbnail
對於剛入門的新手來說,有一些細節概念或許不是那麼清楚的,例如說什麼時候應該做出怎麼樣的調整,來進入下一步調整?
Thumbnail
2021 年,《Roblox》和《原神》等熱門遊戲的用戶支出進一步增長。2021 年下半年,《哈利波特:魔法覺醒》和《英雄聯盟手遊》的發行再度刺激中國大陸的遊戲市場,預計在未來幾個月,這些遊戲將占據收入排行榜的前列,並進一步推動全球移動遊戲的發展。 遊戲用戶支出突破榜 遊戲下載量突破榜
Thumbnail
經科學研究證明,媽媽的乳汁能給寶寶最好最全面的營養,現代社會很多媽媽都是職場女性,休完產假回歸工作之後,沒有辦法親自餵養寶寶,使用吸乳器是個不錯的選擇。那麼吸乳器的種類都有哪些、價位怎麼樣、媽媽們又該怎樣挑選呢?看看小編給大家整理的吸乳器推薦資料吧!
Thumbnail
前一回我介紹了描述「上漲」的好用詞,這次我們看看哪23個英文單字可以專業描述數字的「下跌」。
Thumbnail
我們用英文描述銷售額、成長率或其他財務數字的漲跌時,通常只想到用老梗的「increase(增加)/decrease (減少)」,然後就詞窮了。在職場,對外商主管們做業績簡報時,一直用那兩個老梗字實在很膩,也顯得外語專業不足。我從新聞和影視媒體蒐羅20個傳神用詞,讓你開口談漲跌立刻抓住主管們的注意力!
Thumbnail
你曾夢想到世界各地旅行嗎?你曾夢想能悠遊自在的遨翔天際和海底嗎?你曾夢想能在旅途中交到好友嗎?現在有一款遊戲能滿足你全部的想像,那就是sky光遇。
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
“最終誰是最大贏家?” 最終托斯(Aoy的投資方)取得了最大利益,因為Aoy從始至終就是他打造出來的搖錢樹,沒了保羅競爭他可以賺取更多的錢跟獲得更大的影響力(權力) “權力鬥爭是資方獲取最大利益的棋局”
Thumbnail
" Sometimes it's the people you least expect who do the most incredible thing. " 有時候正是那些最意想不到的人, 才能做出最超出想象的事。 - 出自電影-模仿遊戲🔍 有些人平時毫不張揚 甚至有些不起眼 但是一做事卻
Thumbnail
  有些情你會偶爾想起它,可能是湊巧翻開相冊裡的合影,曾經一起去看過的電影院,又或者是不經意間擦身而過的情侶。那些都會令你想起某個他,也許你已經記不起他的長相、他的聲音、他的姓名,但是只要有人提起關於他的近況。   「你們還有聯繫嗎?」友人問。
Thumbnail
對於剛入門的新手來說,有一些細節概念或許不是那麼清楚的,例如說什麼時候應該做出怎麼樣的調整,來進入下一步調整?
Thumbnail
2021 年,《Roblox》和《原神》等熱門遊戲的用戶支出進一步增長。2021 年下半年,《哈利波特:魔法覺醒》和《英雄聯盟手遊》的發行再度刺激中國大陸的遊戲市場,預計在未來幾個月,這些遊戲將占據收入排行榜的前列,並進一步推動全球移動遊戲的發展。 遊戲用戶支出突破榜 遊戲下載量突破榜
Thumbnail
經科學研究證明,媽媽的乳汁能給寶寶最好最全面的營養,現代社會很多媽媽都是職場女性,休完產假回歸工作之後,沒有辦法親自餵養寶寶,使用吸乳器是個不錯的選擇。那麼吸乳器的種類都有哪些、價位怎麼樣、媽媽們又該怎樣挑選呢?看看小編給大家整理的吸乳器推薦資料吧!
Thumbnail
前一回我介紹了描述「上漲」的好用詞,這次我們看看哪23個英文單字可以專業描述數字的「下跌」。
Thumbnail
我們用英文描述銷售額、成長率或其他財務數字的漲跌時,通常只想到用老梗的「increase(增加)/decrease (減少)」,然後就詞窮了。在職場,對外商主管們做業績簡報時,一直用那兩個老梗字實在很膩,也顯得外語專業不足。我從新聞和影視媒體蒐羅20個傳神用詞,讓你開口談漲跌立刻抓住主管們的注意力!
Thumbnail
你曾夢想到世界各地旅行嗎?你曾夢想能悠遊自在的遨翔天際和海底嗎?你曾夢想能在旅途中交到好友嗎?現在有一款遊戲能滿足你全部的想像,那就是sky光遇。