【LeetCode 熱題 100】55. 跳躍游戲

Problem: 55. 跳躍游戲
給你一個非負整數數組 nums ,你最初位于數組的 第一個下標 。數組中的每個元素代表你在該位置可以跳躍的最大長度。
判斷你是否能夠到達最后一個下標,如果可以,返回 true ;否則,返回 false 。

文章目錄

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

整體思路

這段代碼旨在解決經典的 “跳躍游戲” (Jump Game) 問題。問題要求判斷給定一個非負整數數組,你是否能夠從第一個索引(位置0)開始,最終到達數組的最后一個索引。數組中的每個元素代表你在該位置可以跳躍的最大長度。

該算法采用了一種非常高效且直觀的 貪心算法 (Greedy Algorithm)。其核心思想不是去模擬每一步具體的跳躍,而是去維護一個當前可到達的最遠距離

算法的邏輯步驟如下:

  1. 維護一個“可達范圍”

    • 算法使用一個變量 maxLoc 來記錄從起點(索引0)出發,通過已經訪問過的所有位置,能夠到達的最遠索引。
    • maxLoc 初始化為 0,因為我們最初就站在索引 0 的位置。
  2. 遍歷與檢查

    • 算法通過一個 for 循環,從左到右遍歷數組的每一個位置 i
    • 核心檢查(可達性判斷):在循環的每一步,首先檢查當前位置 i 是否在之前計算出的 maxLoc 的覆蓋范圍之內。即 if (i > maxLoc)
      • 如果 i > maxLoc,這意味著當前位置 i 根本無法從任何前面的位置跳躍到達。就好像河流中間斷了一截,我們永遠也到不了對岸。在這種情況下,我們不可能到達數組的末尾,因此直接返回 false
    • 貪心更新(擴展范圍):如果當前位置 i 是可達的,我們就利用這個位置的跳躍能力來嘗試擴展我們的“可達范圍”。
      • 從位置 i 出發,最遠可以跳到 i + nums[i]
      • 我們將這個新的可達距離與已知的最遠距離 maxLoc 進行比較,并更新 maxLoc 為兩者中的較大值。即 maxLoc = Math.max(maxLoc, i + nums[i])
      • 這個貪心的選擇在于,我們總是希望把我們能到達的邊界推得盡可能遠。
  3. 最終結果

    • 如果循環能夠順利完成(即從未觸發 i > maxLoc 的條件),這意味著數組的每一個位置(包括最后一個位置 n-1)都在我們的可達范圍之內。
    • 因此,只要循環能走完,就說明最后一個位置是可達的,返回 true

完整代碼

class Solution {/*** 判斷是否能從數組的第一個位置跳到最后一個位置。* @param nums 數組,每個元素代表在該位置的最大跳躍長度。* @return 如果可以到達最后一個位置,則返回 true,否則返回 false。*/public boolean canJump(int[] nums) {int n = nums.length;// maxLoc: 記錄從起點出發,當前能夠到達的最遠位置的索引。// 這是一個貪心選擇,我們總是希望這個值越大越好。int maxLoc = 0;// 遍歷數組的每一個位置,i 代表當前位置的索引。for (int i = 0; i < n; i++) {// 核心判斷:檢查當前位置 i 是否可達。// 如果當前位置 i 已經超出了之前所有位置能夠到達的最遠距離 maxLoc,// 說明 i 這個位置是無論如何也無法到達的,因此直接返回 false。if (i > maxLoc) {return false;}// 貪心更新:更新能夠到達的最遠位置。// 從當前位置 i 出發,最遠可以跳到 i + nums[i]。// 我們取這個新值與已知的最遠位置 maxLoc 中的較大者,作為新的最遠可達距離。maxLoc = Math.max(maxLoc, i + nums[i]);// 一個小優化:如果 maxLoc 已經能覆蓋或超過最后一個位置,就可以提前結束了。// if (maxLoc >= n - 1) {//     return true;// }}// 如果循環能夠順利完成,意味著數組的最后一個位置(n-1)也是可達的// (因為它沒有在 if (i > maxLoc) 中被攔截),因此返回 true。return true;}
}

時空復雜度

時間復雜度:O(N)

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

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

空間復雜度:O(1)

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

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

參考靈神

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

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

相關文章

Java-JVM是什么JVM的類加載機制

一.JVM是什么1.jvm是java虛擬機&#xff0c;是java程序運行的基礎環境2.jvm運行的是java源代碼經過編譯后的class文件&#xff0c;這些class文件經過jvm負責解釋或即時編譯為對應平臺的機器碼并執行3.class文件也可以通過其他【jvm languages】經過編譯后得到&#xff0c;例如s…

做亞馬遜廣告,有哪些提高效率的工具

"為什么每天花3小時調整廣告卻看不到效果&#xff1f;""如何避免高轉化關鍵詞被競爭對手搶走&#xff1f;""為什么手動調整預算總是慢市場半拍&#xff1f;""ACOS居高不下真的是關鍵詞選錯了嗎&#xff1f;""有沒有工具能真正實現…

研究學習3DGS的順序

6 個核心基礎模塊 序號模塊說明推薦學習順序1&#x1f4f7; 三維計算機視覺基礎建立對3D場景、點云、體積的空間理解?第一個2&#x1f9ee; CT成像原理與圖像表示理解CT圖像本質、斷層數據、密度單位?并行進行3&#x1f7e1; NeRF與3D Gaussian Splatting原理掌握點云/高斯場…

期刊分類計算機領域會議

該圖片已上傳圖床&#xff0c;需要可自行下載&#xff1a; https://youke1.picui.cn/s1/2025/08/15/689f1e3553930.png 參考鏈接&#xff1a; 【干貨】最全學術期刊級別分類講解_嗶哩嗶哩_bilibili

【計算機視覺與深度學習實戰】01基于直方圖優化的圖像去霧技術

摘要 隨著計算機視覺技術的快速發展,圖像去霧已成為數字圖像處理領域的重要研究方向。霧霾、灰塵、水汽等環境因素會嚴重降低圖像的對比度和可見度,影響圖像的視覺效果和后續的計算機視覺任務。本文深入探討了基于直方圖優化的圖像去霧技術,包括全局直方圖均衡化、對比度限…

Vue3 + Axios 實現一個精美天氣組件(含實時與未來預報)

Vue3 Axios 實現一個精美天氣組件&#xff08;含實時與未來預報&#xff09; 一、前言 在很多管理系統、信息看板、門戶首頁中&#xff0c;天氣模塊是一個常見的小組件。 它不僅能展示當前的氣溫、天氣狀況&#xff0c;還能提供未來幾天的天氣趨勢&#xff0c;讓用戶對環境有…

Unity:GUI筆記(二)——工具欄和選擇網格、滾動列表和分組、窗口、自定義皮膚樣式、自動布局

寫在前面&#xff1a;寫本系列(自用)的目的是回顧已經學過的知識、記錄新學習的知識或是記錄心得理解&#xff0c;方便自己以后快速復習&#xff0c;減少遺忘。五、工具欄和選擇網格1、工具欄使用Unity提供的API&#xff1a;GUI.Toolbar()可以創建一個工具欄。有三個參數是必須…

Streamlit實現Qwen對話機器人

Web界面 一、Streamlit 是一個用于創建數據科學和機器學習應用的開源前端框架&#xff0c;能夠快速將 Python 腳本轉化為交互式 Web 應用。通過簡單的 Python API 就能構建出交互式的數據應用。 1、主要特點 簡單易用&#xff1a;純 Python 編寫代碼&#xff0c;API 簡潔直觀…

Linux-地址空間

目錄 1.介紹 2.理解 3.Linux早期的內核調度隊列 1.介紹 這是32位的程序空間地址圖&#xff1a; 為了更好地理解這段圖&#xff0c;我們來寫一段代碼編譯運行&#xff1a; #include <stdio.h> #include <string.h> #include <unistd.h> #include <std…

**標題:發散創新之力,探索隱私計算的未來**隱私計算,作為當下數字化時代的熱門話題,正受

標題&#xff1a;發散創新之力&#xff0c;探索隱私計算的未來 隱私計算&#xff0c;作為當下數字化時代的熱門話題&#xff0c;正受到越來越多開發者和從業者的關注。本文將帶您走進隱私計算的奇妙世界&#xff0c;探討其背后的技術原理、應用場景以及發展趨勢。 一、隱私計算…

線程P5 | 單例模式[線程安全版]~懶漢 + 餓漢

什么是單例模式&#xff1f;在我們正式講解單例模式之前&#xff0c;沒有了解過的小伙伴可能會有疑問...到底啥叫單例模式&#xff1f;&#xff1f;其實單例模式呢&#xff0c;是我們設計模式中的一種&#xff0c;所謂的設計模式&#xff0c;你可以把它理解為一個模板&#xff…

kubernetes中數據存儲etcd

etcd 在 Kubernetes 中的角色核心定位&#xff1a;Kubernetes 的 唯一持久化數據存儲&#xff08;一致性數據庫&#xff09;。職責&#xff1a; 保存整個集群的期望狀態&#xff08;desired state&#xff09;&#xff0c;包括節點信息、Pod 清單、Service 定義、ConfigMap、Se…

Linux crontab定時任務

參考資料 【図解】cronの仕組み定時任務 - crontab解決ubuntu下定時任務不執行問題crontab環境變量問題&#x1f4a5;Linux定時任務功能詳解&#xff1a;crontab與at命令應用指南 目錄一. 環境準備1.1 wsl開啟systemd1.2 開啟cron日志二. cron服務管理相關命令2.1 service 的方…

企業頻繁收到軟件律師函?如何徹底解決這一難題

1. 引言&#xff1a;律師函頻發&#xff0c;已成信息化管理的“隱形雷區”在工業制造、芯片、航空航天、船舶制造、醫療器械等高要求行業&#xff0c;軟件不僅是研發與生產的關鍵工具&#xff0c;更是企業數據與知識產權安全的“底座”。然而&#xff0c;不少企業卻在日常運營中…

在 macOS 上順利安裝 lapsolver

一、什么是 lapsolver&#xff1f; lapsolver 是一個用于求解線性分配問題&#xff08;Linear Assignment Problem, LAP&#xff09; 的 Python 庫。線性分配問題是運籌學中的經典問題&#xff0c;核心是在兩個集合&#xff08;如“工人”與“任務”&#xff09;之間找到一組最…

宋紅康 JVM 筆記 Day02|JVM的架構模型、生命周期、發展歷程

一、今日視頻區間 P13-P25 二、一句話總結 JVM的架構模型&#xff1b;JVM的生命周期&#xff1b;JVM發展歷程&#xff1b; 三、關鍵圖/命令 3.1 JVM的架構模型Java程序對.class字節碼文件進行反編譯操作&#xff1a;在idea中先運行需要反編譯的代碼&#xff0c;找到對應的字節碼…

Linux新手上路 | 在Ubuntu上Pluma文本編輯器的安裝與基本使用

Linux新手上路 | 在Ubuntu上Pluma文本編輯器的安裝與基本使用一、Pluma工具介紹1.1 Pluma 工具概述1.2 主要功能1.3 適用場景二、安裝Pluma2.1 安裝方法2.2 啟動Pluma工具三、漢化方法3.1 安裝漢化包3.2 設置系統語言3.3 重新打開Pluma四、基本使用方法4.1 編寫文本內容4.2 關鍵…

React 揭秘:從新手到高手的進階之路

目錄 React&#xff1a;前端開發新寵? React 初相識? 什么是 React? React 的核心特性? 1.組件化開發 2.虛擬 DOM 與 Diff 算法 單向數據流 搭建 React 開發環境 環境準備? 創建 React 項目 項目結構解析 React 基礎語法與核心概念 JSX 語法? 基本語法規則…

八股文小記 Servlet 過濾器-Spring MVC 攔截器-Spring AOP 攔截器區別

您對執行機制的洞察非常準確&#xff01;讓我們深入分析這三種組件的調用機制及其與 AOP 節點的關系&#xff1a; 一、執行機制的本質區別組件調用機制實現原理Servlet 過濾器遞歸調用通過 FilterChain.doFilter() 顯式遞歸調用下一個節點Spring MVC 攔截器遍歷調用由 HandlerE…

qml 實現數值鍵盤

import QtQuick 2.0import QtQuick.Layouts 1.12 import"../pad" // PasswordKeyboard.qml import QtQuick 2.12ColumnLayout {id: keyboardspacing: 8// 鍵盤標題Text {text: "安全輸入"font.pixelSize: 16color: "#666"Layout.alignment: Qt.A…