【LeetCode 熱題 100】45. 跳躍游戲 II

Problem: 45. 跳躍游戲 II
給定一個長度為 n 的 0 索引整數數組 nums。初始位置為 nums[0]。
每個元素 nums[i] 表示從索引 i 向后跳轉的最大長度。換句話說,如果你在索引 i 處,你可以跳轉到任意 (i + j) 處:
0 <= j <= nums[i] 且
i + j < n
返回到達 n - 1 的最小跳躍次數。測試用例保證可以到達 n - 1。

文章目錄

  • 整體思路
  • 完整代碼
  • 時空復雜度
    • 時間復雜度:O(N)
    • 空間復雜度:O(1)

整體思路

這段代碼旨在解決經典的 “跳躍游戲 II” (Jump Game II) 問題。與判斷“能否到達”的第一代問題不同,此問題要求在假設總能到達終點的前提下,計算出到達數組最后一個位置所需的 最小跳躍次數

該算法采用了一種非常高效的 貪心算法,其思想可以類比為 廣度優先搜索 (BFS)。它不是關注每一步具體跳到哪里,而是在每一“跳”的范圍內,尋找下一“跳”能到達的最遠距離。

算法的邏輯步驟如下:

  1. 定義邊界

    • 算法使用兩個核心變量來定義跳躍的邊界:
      • curRight當前這一跳所能到達的最遠邊界。可以理解為 BFS 中當前層的右邊界。
      • nxtRight:從當前層(0curRight 之間的所有位置)出發,下一跳所能到達的最遠邊界。
    • ans 變量用于累計跳躍的次數。
  2. 貪心遍歷

    • 算法通過一個 for 循環遍歷數組。循環的終止條件是 i < nums.length - 1,這一點非常關鍵,因為我們只需要考慮從倒數第二個位置(或之前)起跳的情況,一旦到達或越過最后一個位置,就不需要再跳了。
    • 在當前跳躍范圍內尋找最優的下一步:在循環的每一步(i0curRight),我們都在當前可達的范圍內。對于每個位置 i,我們計算從它出發能跳到的最遠距離 nums[i] + i。然后,我們用這個值去貪心地更新 nxtRight (nxtRight = Math.max(nxtRight, nums[i] + i))。這確保了 nxtRight 始終記錄著從當前這一跳的覆蓋范圍內,能為下一跳創造的最遠落點。
    • 執行跳躍:當循環變量 i 到達了 curRight 的邊界時,意味著我們已經遍歷完了當前這一跳能到達的所有位置。此時,我們必須執行一次跳躍才能繼續前進。
      • if (i == curRight) 這個條件就是“執行跳躍”的觸發器。
      • 當觸發時,我們將 curRight 更新為 nxtRight,這相當于進入了 BFS 的下一層,設定了新的、更遠的可達邊界。
      • 同時,我們將跳躍次數 ans 加一。
  3. 返回結果

    • 當循環結束時,ans 中就記錄了到達終點所需的最小跳躍次數。

完整代碼

class Solution {/*** 計算到達數組最后一個位置所需的最小跳躍次數。* @param nums 數組,每個元素代表在該位置的最大跳躍長度。* @return 最小跳躍次數*/public int jump(int[] nums) {// curRight: 當前這一跳能夠到達的最遠右邊界。int curRight = 0;// nxtRight: 在當前跳躍的覆蓋范圍內,下一步能夠到達的最遠右邊界。int nxtRight = 0;// ans: 記錄跳躍的次數,即結果。int ans = 0;// 遍歷數組。循環到倒數第二個元素即可,因為我們的目標是“到達”最后一個位置,// 而不是從最后一個位置起跳。for (int i = 0; i < nums.length - 1; i++) {// 貪心選擇:更新下一步能到達的最遠距離。// 在當前跳躍的可達范圍內(i 從 0 到 curRight),// 我們不斷計算從每個位置 i 出發能跳到的最遠點 (nums[i] + i),// 并用它來更新 nxtRight。nxtRight = Math.max(nxtRight, nums[i] + i);// 觸發跳躍的條件:當 i 到達了當前跳躍的邊界。// 這意味著我們已經考察完了當前這一跳能到達的所有位置,// 必須進行一次新的跳躍才能繼續前進。if (i == curRight) {// 更新當前跳躍的邊界為下一步能到達的最遠邊界。curRight = nxtRight;// 跳躍次數加一。ans++;}}// 循環結束后,ans 即為最小跳躍次數。return ans;}
}

時空復雜度

時間復雜度:O(N)

  1. 循環:算法的核心是一個 for 循環,它從 i = 0 遍歷到 nums.length - 2。這個循環最多執行 N-1 次,其中 Nnums 數組的長度。
  2. 循環內部操作
    • 在循環的每一次迭代中,執行的都是基本的 Math.max、加法、比較和賦值操作。
    • 這些操作的時間復雜度都是 O(1)

綜合分析
算法由 N-1 次 O(1) 的操作組成。因此,總的時間復雜度是 (N-1) * O(1) = O(N)

空間復雜度:O(1)

  1. 主要存儲開銷:算法只使用了幾個固定數量的整型變量(curRight, nxtRight, ans, i)。
  2. 空間大小:這些變量的數量不隨輸入數組 nums 的大小 N 而改變。

綜合分析
算法沒有使用任何與輸入規模 N 成比例的額外數據結構(如新數組或哈希表)。因此,其額外輔助空間復雜度為 O(1)

參考靈神

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/93238.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/93238.shtml
英文地址,請注明出處:http://en.pswp.cn/web/93238.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

池式管理之線程池

1.初識線程池問&#xff1a;線程池是什么&#xff1f;答&#xff1a;維持管理一定數量的線程的池式結構。&#xff08;維持&#xff1a;線程復用 。 管理&#xff1a;沒有收到任務的線程處于阻塞休眠狀態不參與cpu調度 。一定數量&#xff1a;數量太多的線程會給操作系統帶來線…

嬰兒 3D 安睡系統專利拆解:搭扣與智能系帶的鎖定機制及松緊調節原理

凌晨2點&#xff0c;你盯著嬰兒床里的小肉團直嘆氣。剛用襁褓裹成小粽子才哄睡的寶寶&#xff0c;才半小時就蹬開了裹布&#xff0c;小胳膊支棱得像只小考拉&#xff1b;你手忙腳亂想重新裹緊&#xff0c;結果越裹越松&#xff0c;裹布滑到脖子邊&#xff0c;寶寶突然一個翻身&…

pandas中df.to _dict(orient=‘records‘)方法的作用和場景說明

df.to _dict(orientrecords) 是 Pandas DataFrame 的一個方法&#xff0c;用于將數據轉換為字典列表格式。以下是詳細解釋及實例說明&#xff1a; 一、核心含義作用 將 DataFrame 的每一行轉換為一個字典&#xff0c;所有字典組成一個列表。 每個字典的鍵&#xff08;key&#…

阿里云Anolis OS 8.6的公有云倉庫源配置步驟

文章目錄一、備份現有倉庫配置&#xff08;防止誤操作&#xff09;二、配置阿里云鏡像源2.1 修改 BaseOS 倉庫2.2 修改 AppStream 倉庫三、清理并重建緩存四、驗證配置4.1 ?檢查倉庫狀態?&#xff1a;五、常見問題解決5.1 ?HTTP 404 錯誤5.2 ?網絡連接問題附&#xff1a;其…

回歸預測 | Matlab實現CNN-BiLSTM-self-Attention多變量回歸預測

回歸預測 | Matlab實現CNN-BiLSTM-self-Attention多變量回歸預測 目錄回歸預測 | Matlab實現CNN-BiLSTM-self-Attention多變量回歸預測預測效果基本介紹程序設計參考資料預測效果 基本介紹 1.Matlab實現CNN-BiLSTM融合自注意力機制多變量回歸預測&#xff0c;CNN-BiLSTM-self-…

103、【OS】【Nuttx】【周邊】文檔構建渲染:Sphinx 配置文件

【聲明】本博客所有內容均為個人業余時間創作&#xff0c;所述技術案例均來自公開開源項目&#xff08;如Github&#xff0c;Apache基金會&#xff09;&#xff0c;不涉及任何企業機密或未公開技術&#xff0c;如有侵權請聯系刪除 背景 接之前 blog 【OS】【Nuttx】【周邊】文…

轉換一個python項目到moonbit,碰到報錯輸出:編譯器對workflow.mbt文件中的類方法要求不一致的類型注解,導致無法正常編譯

先上結論&#xff1a;現在是moon test的時候有很多報錯&#xff0c;消不掉。問題在Trae中用GLM-4.5模型&#xff0c;轉換一個python項目到moonbit&#xff0c;碰到報錯輸出&#xff1a;報錯輸出經過多次嘗試修復&#xff0c;我發現這是一個MoonBit編譯器的bug。編譯器對workflo…

【C#補全計劃】事件

一、事件的概念1. 事件是基于委托的存在&#xff0c;是委托的安全包裹&#xff0c;讓委托的使用更具有安全性2. 事件是一種特殊的變量類型二、事件的使用1. 語法&#xff1a;event 委托類型 事件名;2. 使用&#xff1a;&#xff08;1&#xff09;事件是作為成員變量存在與類中&…

java內存緩存

我們在項目中會經常使Redis和Memcache,但是簡單項目就沒必要使用專門的緩存框架來增加系統的復雜性。用Java代碼邏輯就能實現內存級別的緩存。1.定時任務線程池使用ScheduledExecutorService結合ConcurrentHashMap&#xff0c;如果你使用的是ConcurrentHashMap&#xff0c;你可…

智能工廠生產監控大屏-vue純前端靜態頁面練習

學習前端還是非常有意思的&#xff0c;因為前端真的是可見即所得&#xff0c;可以做出來非常好看漂亮的頁面&#xff0c;最近我就在使用前端技術 做一些大屏報表&#xff0c;在制作這些大屏報表過程中&#xff0c;又熟練的練習了自己的學到的相關的前端技術&#xff0c;接下來把…

HTTP 協議詳細介紹

目錄一、HTTP 的基本概念與歷史演進1. 核心定義2. 歷史版本演進二、HTTP 的核心工作原理1. 請求-響應模型2. 基于 TCP 的傳輸&#xff08;HTTP/1.1、HTTP/2&#xff09;三、HTTP 請求結構1. 請求行2. 請求頭3. 請求體四、HTTP 響應結構1. 狀態行2. 響應頭3. 響應體五、HTTP 與 …

正則化:從過擬合到泛化的「平衡藝術」

在機器學習領域&#xff0c;有一個幾乎所有從業者都會遇到的「噩夢」&#xff1a;模型在訓練集上表現完美&#xff08;損失趨近于0&#xff09;&#xff0c;但在測試集上卻大幅「翻車」。這種現象被稱為「過擬合」&#xff08;Overfitting&#xff09;&#xff0c;它像一把雙刃…

[Python 基礎課程]根據描述定義一個 Person 類

人都屬于人類這個物種&#xff0c;每一個人都會有姓名和年齡&#xff0c;人都可以介紹自己&#xff0c;隨著時間的流逝&#xff0c;人都會增加年齡&#xff0c;每一個人都能獲取到自己的物種信息。 我們的抽象過程&#xff1a; 所有的 Person 對象都應該有一個共同的屬性來表示…

熱門手機機型重啟速度對比

以下是2023-2024年市場主流熱門手機機型的重啟速度對比分析&#xff0c;基于公開測試數據和用戶反饋整理&#xff08;數據會因系統版本和測試環境不同存在波動&#xff09;&#xff1a;旗艦機型重啟速度排名&#xff08;冷啟動&#xff09;排名機型平均重啟時間關鍵配置優化技術…

第454題.四數相加II

第454題.四數相加II 力扣題目鏈接(opens new window) 給定四個包含整數的數組列表 A , B , C , D ,計算有多少個元組 (i, j, k, l) &#xff0c;使得 A[i] B[j] C[k] D[l] 0。 為了使問題簡單化&#xff0c;所有的 A, B, C, D 具有相同的長度 N&#xff0c;且 0 ≤ N ≤…

力扣top100(day04-05)--堆

本文為力扣TOP100刷題筆記 筆者根據數據結構理論加上最近刷題整理了一套 數據結構理論加常用方法以下為該文章&#xff1a; 力扣外傳之數據結構&#xff08;一篇文章搞定數據結構&#xff09; 215. 數組中的第K個最大元素 class Solution {// 快速選擇遞歸函數int quickselect(…

CCS雙軸相位偏移光源 讓淺凹痕無處遁形

在工業檢測中&#xff0c;淺凹痕表面檢測對精度和可靠性要求極高&#xff0c;工業光源在此過程中扮演著關鍵角色&#xff0c;工業光源通過精準的光學設計&#xff08;角度、波長、強度&#xff09;將肉眼不可見的淺凹痕轉化為可量化的光學信號&#xff0c;是實現高精度自動化檢…

專題三_二分_x 的平方根

一&#xff1a;題目解釋&#xff1a;返回x的算數平方根&#xff0c;如果是小數&#xff0c;則舍去小數部分&#xff0c;返回整數即可&#xff01;二&#xff1a;算法①&#xff1a;暴力從1開始求平方&#xff0c;最后要么直接找到一個值的平方為x&#xff0c;要么發現x在兩個相…

Python 操作 Redis 的客戶端庫 redis-py

Python 操作 Redis 的客戶端庫 redis-py1. Installation2. Connect and test3. Connection Pools4. Redis Commands4.1. set(name, value, exNone, pxNone, nxFalse, xxFalse, keepttlFalse, getFalse, exatNone, pxatNone)4.1.1. setnx(name, value)4.1.2. setex(name, time, …

社區物業HCommunity本地部署手冊

HC小區管理系統安裝手動版 更多文章參考&#xff1a; http://www.homecommunity.cn/pages/hc/hcH5_cn.html 1.0 說明 很多開發不太喜歡用梓豪安裝&#xff0c;希望通過手工自己安裝&#xff0c;這個就需要開發人員 有一定的安裝軟件能力&#xff0c;比如能夠自行安裝mysql能…