遊戲模擬 Jump Game 青蛙過河 Leetcode_#55

閱讀時間約 7 分鐘

題目敘述

題目會給我們一個輸入陣列nums,每個元素值代表那個格子點可以跳躍的最大長度

一開始從最左邊的格子點出發開始跳,請問可以成功抵達終點,也就是最右邊的格子點嗎?

如果可以,返回 True。

如果不行,返回False。


題目的原文敘述


測試範例

Example 1:

Input: nums = [2,3,1,1,4]
Output: true
Explanation: Jump 1 step from index 0 to 1, then 3 steps to the last index.

0 -> 1 - > 4
先從零跳一步到1
再從13步,可以抵達終點​,也就是第四個格子點。

Example 2:

Input: nums = [3,2,1,0,4]
Output: false
Explanation: You will always arrive at index 3 no matter what. Its maximum jump length is 0, which makes it impossible to reach the last index.
無​解,跳不過去。

約束條件

Constraints:

  • 1 <= nums.length <= 10^4

輸入陣列的長度介於1 ~ 10^4 。

  • 0 <= nums[i] <= 10^5

每個格子點最小可以跳0格,相當於留在原地代表題目可能會給陷阱格子

最大可以跳10^5個格子。


演算法 第一知覺的想法

第一直覺想到就是依照遊戲規則去模擬,盡量往右邊跳,看看能不能從起點0開始跳到終點?

當然是可以的,但是仔細留意一下,nums[i]最大可以有10^5,代表每個格子點可能的選擇(也就是分枝)可以有十萬條路徑,顯然用直接進行模擬會存在執行速度太慢或者time-out超過時間限制的風險,因為是指數級別的枚舉所有跳躍路徑


這題其實用DFS模擬,或者BFS模擬跳躍,還是勉強可以通過平台的測試。


但是,後面我們會介紹一個更好的演算法,採用貪心策略Greedy strategy的演算法來提升速度

程式法 DFS模擬跳躍

class Solution:
def canJump(self, nums: List[int]) -> bool:

destination = len(nums)-1

if destination == 0:
return True

seen = set([0])

def dfs(i):

if i >= destination:
return True

for jump in range(1, nums[i]+1) :
if (i + jump) not in seen:
seen.add( i + jump )
if i + jump >= destination or dfs( i + jump):
return True

return False

# ===========================
return dfs( i = 0)

程式碼 BFS模擬跳躍

class Solution:
def canJump(self, nums: List[int]) -> bool:

destination = len(nums)-1

if destination == 0:
return True

bfs_q = deque([0])
seen = set([0])

while bfs_q:

cur = bfs_q.popleft()

for jump in reversed(range(1, nums[cur]+1)):

if cur + jump >= destination:
return True

if cur+jump not in seen:
bfs_q.append( cur+jump )
seen.add( cur+jump )

return False

演算法 Greedy 策略 盡量去延伸我能抵達的地方

其實題目真正問的關鍵在於"能不能夠"抵達終點?

題目並沒有去要求我們列出跳躍的路徑(也就是過程)。

題目只關心結果,能不能抵達終點?


換句話說,假如我們經由跳躍能夠碰觸的範圍,盡量去往右邊延伸,可以覆蓋到終點,那麼一定有解,可以從起點開始跳躍,抵達終點。

如果不行,則代表半路上就停下來了,已經盡力跳了,但是就是過不去,無解,返回False。


程式碼 Greedy 策略 盡量去延伸我能抵達的地方

class Solution:
def canJump(self, nums: List[int]) -> bool:

# 能夠抵達的範圍
max_reach = nums[0]

for i, jump in enumerate(nums):

# 已經盡力跳了,但是到不了 index i,
# 半路上就被迫停下來了,無解。
if max_reach < i:
return False

# 盡量去往右邊延伸經由跳躍能夠碰觸的範圍,
max_reach = max(max_reach, i + jump)

# 假如跳耀的範圍能覆蓋終點,那麼一定有解
return max_reach >= ( len(nums)-1 )

複雜度分析 Greedy 策略 盡量去延伸我能抵達的地方

令n=輸入陣列nums的長度

時間複雜度:

從左邊到右邊逐一檢查每個格子點,盡量去延伸跳躍能覆蓋的範圍,總共所需時間為O(n)。


空間複雜度:

用到的都是固定尺寸的臨時變數,總共所需空間為O(1)。


關鍵知識點

題目並沒有去要求我們列出跳躍的路徑(也就是過程)。

題目只關心結果,能不能抵達終點?

換句話說,假如我們經由跳躍能夠碰觸的範圍,盡量去往右邊延伸,可以覆蓋到終點,那麼一定有解,可以從起點開始跳躍,抵達終點。

如果不行,則代表半路上就停下來了,已經盡力跳了,但是就是過不去,無解,返回False。


Reference:

[1] Jump Game_Python solution sharing

80會員
417Content count
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
題目敘述 題目會給我們一個房間陣列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。 註: 題目還允許重複使用字庫裡面的字去串接。
題目敘述 題目會給定一個指定高度和寬的方格版,還有一顆小球的起始位置,和最大移動步數。 小球每一步可以選擇向上、下、左、右移動一格,請問小球能走到方格版界外的路徑方法數總共有幾種? 方法數可能很大,題目要求,最後回傳答案時,先對10^9+7做除法取餘數再回傳。 題目的原文敘述 約束條件
題目敘述 題目給定我們一顆二元樹的根節點,要求我們計算出從根節點到葉子節點的偽回文路徑路徑有幾條? 偽回文路徑路徑 的定義: 路徑經過重新排列之後,可以形成回文Palindrome,也就是頭尾鏡像對稱。 ​ 例如: 1 -> 3 -> 3 重新排列之後,可以形成 3 -> 1 -> 3
題目敘述 題目會給定一個字串陣列arr最為輸入,我們可以任意選擇一組不包含重複字元的陣列子序列,將字串進行串接,成為字串s,請問字串s的最大長度是多少? 例如: arr=["dog","cow","cat"] 我們可以選擇"dog", "cat"進行串接,得到的字串s="dogcat",s的
題目敘述 題目會給我們一個房間陣列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。 註: 題目還允許重複使用字庫裡面的字去串接。
題目敘述 題目會給定一個指定高度和寬的方格版,還有一顆小球的起始位置,和最大移動步數。 小球每一步可以選擇向上、下、左、右移動一格,請問小球能走到方格版界外的路徑方法數總共有幾種? 方法數可能很大,題目要求,最後回傳答案時,先對10^9+7做除法取餘數再回傳。 題目的原文敘述 約束條件
題目敘述 題目給定我們一顆二元樹的根節點,要求我們計算出從根節點到葉子節點的偽回文路徑路徑有幾條? 偽回文路徑路徑 的定義: 路徑經過重新排列之後,可以形成回文Palindrome,也就是頭尾鏡像對稱。 ​ 例如: 1 -> 3 -> 3 重新排列之後,可以形成 3 -> 1 -> 3
題目敘述 題目會給定一個字串陣列arr最為輸入,我們可以任意選擇一組不包含重複字元的陣列子序列,將字串進行串接,成為字串s,請問字串s的最大長度是多少? 例如: arr=["dog","cow","cat"] 我們可以選擇"dog", "cat"進行串接,得到的字串s="dogcat",s的
你可能也想看
Thumbnail
1.加權指數與櫃買指數 週五的加權指數在非農就業數據開出來後,雖稍微低於預期,但指數仍向上噴出,在美股開盤後於21500形成一個爆量假突破後急轉直下,就一路收至最低。 台股方面走勢需觀察週一在斷頭潮出現後,週二或週三開始有無買單進場支撐,在沒有明確的反轉訊號形成前,小夥伴盡量不要貿然抄底,或是追空
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
遊戲有教育意義並不罕見,但有教育意義之餘有趣而且是小品免費遊戲就很少見,由公視團隊打造的《青春網戀模擬器》就是其中一個例子。 在《青春網戀模擬器》,玩家將扮演一位15歲剛與男友分手的女高中生,經朋友介紹下開始玩交友軟體,途中認識到一位很合眼緣和很談得來的男生,兩人自自然然成為情侶,不過男生的要
Thumbnail
13號左右韓國的Krafton Inc.發布了新遊戲inZOI開發畫面 展現高自由度的開放世界 自定義裝修與捏臉系統 以及全方面模擬人生的遊戲內容   目前市面上同類型模擬遊戲 最受歡迎的就是Electronic Arts模擬市民The Sims系列作品 同樣以高自由度為特點加上能夠自
Thumbnail
感謝越來越多民眾關注「虛擬情人」議題,讓我的一系列相關文章獲得廣泛矚目,也陸續受邀前往國泰醫院精神科、臺北醫學大學健康資訊科技國際研究中心、雙和醫院、台大醫院精神部演講「虛擬情人」議題。 隨著越來越多民眾得知虛擬情人功能,接下來必須了解的就是大家心目中對它的「定位」。
Thumbnail
當我在遊玩時,大約95%的時間都是水柱和水聲陪伴著我。嗨,我是茶齋誌佑!2021年在Steam上市的《PowerWash Simulator 強力清潔模擬器》,今年1月於PS和NS平台上發售。原本我以為它只是個洗車、洗建築的輕鬆小品,沒想到它竟成了一款能洗滌我身心的遊戲。
Thumbnail
  由 A2 Softworks 與 Art Games Studio 合作開發的生存模擬冒險遊戲《攀登者:天空是極限(Climber: Sky is the Limit)》今(22)日於 PC 平台推出,官方同步釋出最新宣傳影片。
Thumbnail
筆者日前受邀參與財團法人資訊工業策進會舉辦的「數位分身與沙盒法制環境建構研析」專家座談會,發現新加坡與英國正在進行這樣的「數據模擬分析」專案計畫,實在很像電玩遊戲「模擬城市」(SimCity),其中衍生國家、城市乃至於個人的元宇宙與數位分身(Digital Twin),可應用於分析風險的高低、測試政
Thumbnail
本作為R18調酒師模擬遊戲,玩家將扮演魔王之子,來到人類社會經營酒館,可攻略的對象包含酒吧的店員龍娘、狐狸娘,以及酒客史萊姆娘、獸娘、聖女等等共15位女角,劇情有趣,內容相當豐富。
Thumbnail
《DINKUM》 獨立開發者 James Bendon 打造的模擬經營類型遊戲《真實人生(暫譯,原名:Dinkum)》,是一款讓玩家可以在灌木叢中建造新家園、自由展開新生活的模擬經營遊戲。玩家將在澳大利亞內陸的熱帶尤加利樹叢林盡情探索,探索充滿野生動物的景色,並透過狩獵、採礦、捕魚等收集寶貴資源以生
Bridge+創始人Andy在3年前剛好大學畢業,為了尋找到比較好的工作,他向學長姐多方打聽,了解不同工作的具體情況,在這個過程中他學到了很多,也發覺並不是所有的畢業生都會像他這樣這麼認真去思考、解決自己的職業問題,而是直接扎入職場,因此會碰到各種問題。
Thumbnail
抗疫期間要保持社交距離(Social Distancing),不能時常跟親朋好友見面的漫長日子該怎樣渡過呢?這時候,一份無人島的移居指南出現在廣大的電玩玩家眼前,任天堂 (Nintendo) Switch 的《集合啦!動物森友會》適時推出,成為自我隔離的心靈良藥。
Thumbnail
1.加權指數與櫃買指數 週五的加權指數在非農就業數據開出來後,雖稍微低於預期,但指數仍向上噴出,在美股開盤後於21500形成一個爆量假突破後急轉直下,就一路收至最低。 台股方面走勢需觀察週一在斷頭潮出現後,週二或週三開始有無買單進場支撐,在沒有明確的反轉訊號形成前,小夥伴盡量不要貿然抄底,或是追空
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
遊戲有教育意義並不罕見,但有教育意義之餘有趣而且是小品免費遊戲就很少見,由公視團隊打造的《青春網戀模擬器》就是其中一個例子。 在《青春網戀模擬器》,玩家將扮演一位15歲剛與男友分手的女高中生,經朋友介紹下開始玩交友軟體,途中認識到一位很合眼緣和很談得來的男生,兩人自自然然成為情侶,不過男生的要
Thumbnail
13號左右韓國的Krafton Inc.發布了新遊戲inZOI開發畫面 展現高自由度的開放世界 自定義裝修與捏臉系統 以及全方面模擬人生的遊戲內容   目前市面上同類型模擬遊戲 最受歡迎的就是Electronic Arts模擬市民The Sims系列作品 同樣以高自由度為特點加上能夠自
Thumbnail
感謝越來越多民眾關注「虛擬情人」議題,讓我的一系列相關文章獲得廣泛矚目,也陸續受邀前往國泰醫院精神科、臺北醫學大學健康資訊科技國際研究中心、雙和醫院、台大醫院精神部演講「虛擬情人」議題。 隨著越來越多民眾得知虛擬情人功能,接下來必須了解的就是大家心目中對它的「定位」。
Thumbnail
當我在遊玩時,大約95%的時間都是水柱和水聲陪伴著我。嗨,我是茶齋誌佑!2021年在Steam上市的《PowerWash Simulator 強力清潔模擬器》,今年1月於PS和NS平台上發售。原本我以為它只是個洗車、洗建築的輕鬆小品,沒想到它竟成了一款能洗滌我身心的遊戲。
Thumbnail
  由 A2 Softworks 與 Art Games Studio 合作開發的生存模擬冒險遊戲《攀登者:天空是極限(Climber: Sky is the Limit)》今(22)日於 PC 平台推出,官方同步釋出最新宣傳影片。
Thumbnail
筆者日前受邀參與財團法人資訊工業策進會舉辦的「數位分身與沙盒法制環境建構研析」專家座談會,發現新加坡與英國正在進行這樣的「數據模擬分析」專案計畫,實在很像電玩遊戲「模擬城市」(SimCity),其中衍生國家、城市乃至於個人的元宇宙與數位分身(Digital Twin),可應用於分析風險的高低、測試政
Thumbnail
本作為R18調酒師模擬遊戲,玩家將扮演魔王之子,來到人類社會經營酒館,可攻略的對象包含酒吧的店員龍娘、狐狸娘,以及酒客史萊姆娘、獸娘、聖女等等共15位女角,劇情有趣,內容相當豐富。
Thumbnail
《DINKUM》 獨立開發者 James Bendon 打造的模擬經營類型遊戲《真實人生(暫譯,原名:Dinkum)》,是一款讓玩家可以在灌木叢中建造新家園、自由展開新生活的模擬經營遊戲。玩家將在澳大利亞內陸的熱帶尤加利樹叢林盡情探索,探索充滿野生動物的景色,並透過狩獵、採礦、捕魚等收集寶貴資源以生
Bridge+創始人Andy在3年前剛好大學畢業,為了尋找到比較好的工作,他向學長姐多方打聽,了解不同工作的具體情況,在這個過程中他學到了很多,也發覺並不是所有的畢業生都會像他這樣這麼認真去思考、解決自己的職業問題,而是直接扎入職場,因此會碰到各種問題。
Thumbnail
抗疫期間要保持社交距離(Social Distancing),不能時常跟親朋好友見面的漫長日子該怎樣渡過呢?這時候,一份無人島的移居指南出現在廣大的電玩玩家眼前,任天堂 (Nintendo) Switch 的《集合啦!動物森友會》適時推出,成為自我隔離的心靈良藥。