【LeetCode 熱題 100】62. 不同路徑——(解法二)遞推

Problem: 62. 不同路徑

文章目錄

  • 整體思路
  • 完整代碼
  • 時空復雜度
    • 時間復雜度:O(m * n)
    • 空間復雜度:O(m * n)

整體思路

這段代碼同樣旨在解決 “不同路徑” 問題,但它采用的是一種 自底向上(Bottom-Up)的動態規劃 方法,也稱為 迭代法制表法 (Tabulation)。這種方法通過構建一個DP表(dp 二維數組),從起點開始,逐步計算出到達每個格子的路徑數,最終得到終點的答案。

該實現通過巧妙地增加DP數組的維度(使用 m+1n+1),將邊界條件的處理融入到統一的狀態轉移方程中,使得代碼非常簡潔。

  1. 狀態定義與索引映射

    • 算法定義了一個二維DP數組 dp,大小為 (m+1) x (n+1)
    • dp[i][j] 的含義是:從起點 (1, 1)(對應 nums[0][0])到達網格中的點 (i, j) 的不同路徑數
    • 這是一個索引偏移的技巧。dp 數組的索引 (i, j) 對應了 m x n 網格中的索引 (i-1, j-1)。這樣做的好處是,dp 數組的第0行和第0列可以作為天然的邊界,避免了在循環中進行 i>0j>0 的判斷。
  2. 基礎情況 (Base Case)

    • dp[1][1] = 1:這是整個DP計算的起點。它表示從起點到達起點 (1,1)(即 grid[0][0])只有1條路徑(原地不動)。
    • dp 數組的其他元素默認初始化為 0。dp 的第0行和第0列全為0,這恰好滿足我們的邊界條件:無法從網格外部進入,路徑數為0。
  3. 狀態轉移 (State Transition)

    • 算法使用兩層嵌套循環來填充DP表。循環變量 ij 對應的是 m x n 網格的索引。
    • 在循環的每一步,計算 dp[i+1][j+1] 的值。
    • 狀態轉移方程是 dp[i + 1][j + 1] = dp[i + 1][j] + dp[i][j + 1]
    • 我們來解析這個方程:
      • 要到達 dp 中的點 (i+1, j+1)(對應 grid[i][j]),只能從其左邊的點 (i+1, j)(對應 grid[i][j-1])或上邊的點 (i, j+1)(對應 grid[i-1][j])過來。
      • 因此,到達 (i+1, j+1) 的總路徑數,就是到達這兩個點的路徑數之和。
      • i=0j=0 時,例如計算 dp[1][j+1],方程變為 dp[1][j+1] = dp[1][j] + dp[0][j+1]。因為 dp[0][j+1] 總是0,所以 dp[1][j+1] = dp[1][j],這正確地表示了第一行所有格子的路徑數都為1。對第一列同理。
  4. 返回結果

    • 當所有循環結束后,dp 數組已經完全填充。我們需要的最終答案,即到達終點 grid[m-1][n-1] 的路徑數,就存儲在 dp[m][n] 中。

完整代碼

class Solution {/*** 計算從 m x n 網格的左上角到右下角的不同路徑數。* @param m 網格的行數* @param n 網格的列數* @return 不同的路徑總數*/public int uniquePaths(int m, int n) {// dp: 動態規劃數組。dp[i][j] 表示從起點到網格 (i-1, j-1) 的路徑數。// 使用 m+1, n+1 的大小是為了用第0行和第0列作為邊界,簡化代碼。int[][] dp = new int[m + 1][n + 1];// 基礎情況:到達起點 (0,0) 的路徑數是 1。// 在我們的 dp 表中,這對應 dp[1][1]。dp[1][1] = 1;// i 和 j 是原始網格的索引 (0-based)for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {// 跳過我們已經設置的起點if (i == 0 && j == 0)continue;// 狀態轉移方程:// 到達網格 (i, j) 的路徑數,等于到達其上方格子 (i-1, j)// 和左方格子 (i, j-1) 的路徑數之和。// 在 dp 表中,這對應于:// dp[i+1][j+1] = dp[i][j+1] + dp[i+1][j]dp[i + 1][j + 1] = dp[i + 1][j] + dp[i][j + 1];}}// 最終答案是到達網格 (m-1, n-1) 的路徑數,對應 dp[m][n]。return dp[m][n];}
}

時空復雜度

時間復雜度:O(m * n)

  1. 循環結構:算法使用了兩層嵌套的 for 循環。
    • 外層循環從 i = 0 運行到 m-1,執行 m 次。
    • 內層循環從 j = 0 運行到 n-1,執行 n 次。
  2. 計算依據
    • 總的操作次數(主要是加法和賦值)是內外層循環次數的乘積,即 m * n

綜合分析
算法的時間復雜度為 O(m * n)

空間復雜度:O(m * n)

  1. 主要存儲開銷:算法創建了一個名為 dp 的二維整型數組來存儲動態規劃的所有中間狀態。
  2. 空間大小:該數組的大小是 (m + 1) * (n + 1)

綜合分析
算法所需的額外空間主要由 dp 數組決定,其空間復雜度為 O(m * n)

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

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

相關文章

C++ 高階錯誤解析:MSVC 與 Qt 全景指南

在 C 開發中&#xff0c;尤其是在 Windows 平臺使用 MSVC 或 Qt 框架 時&#xff0c;程序員經常會遇到編譯錯誤、鏈接錯誤和運行時異常。本文將系統梳理這些問題&#xff0c;按 語法錯誤、類型錯誤、鏈接錯誤、Qt 運行錯誤 分類&#xff0c;并給出 觸發示例、原因分析及修復策略…

基于Net海洋生態環境保護系統的設計與實現(代碼+數據庫+LW)

摘要 隨著全球氣候變化和人類活動的加劇&#xff0c;海洋生態系統面臨著前所未有的威脅。污染、過度捕撈、棲息地破壞等問題嚴重影響了海洋生物多樣性和生態平衡。為了應對海洋生態系統面臨的嚴重威脅&#xff0c;如污染、過度捕撈和棲息地破壞等問題&#xff0c;利用C#語言和…

DoIP路由激活報文

目錄 DoIP路由激活報文詳解 基本概念 報文結構 響應報文 通信流程 注意事項 **DoIP (Diagnostics over Internet Protocol) 報文詳解** **1. DoIP 報文結構** **1.1 通用報文格式** **2. 常見 DoIP 報文類型** **3. 典型 DoIP 報文示例** **3.1 車輛識別請求(廣播)** **3.2 車…

學習Python中Selenium模塊的基本用法(8:元素操作-2)

定位網頁元素后&#xff0c;調用is_displayed函數可以判斷元素的顯示狀態&#xff0c;如百度網站中有默認隱藏的元素&#xff0c;此時即可使用is_displayed函數判斷該元素的顯示狀態&#xff0c;如下面代碼所示&#xff1a;driver webdriver.Chrome() driver.get("https:…

雙指針:從「LC11 盛最多水的容器」到「LC42 接雨水」

LC11 盛最多水的容器 選擇兩條線&#xff0c;它們與x軸構成的容器可以盛的水量取決于兩條線中較短的那條以及兩條線之間的距離。 樸素的思想是使用i和j遍歷height中的所有線&#xff0c;但是這樣的時間復雜度是O(n2)O(n^2)O(n2)。 我們讓i從0開始&#xff0c;j從n-1開始&…

WINTRUST!_GetMessage函數分析之CRYPT32!CryptSIPGetSignedDataMsg函數的作用是得到nt5inf.cat的信息

UEDIT打開nt5inf.cat。第一部分&#xff1a;BOOL _GetMessage(CRYPT_PROVIDER_DATA *pProvData) {DWORD dwMsgEncoding;SIP_SUBJECTINFO *pSubjInfo;SIP_DISPATCH_INFO *pSip;DWORD cbEncodedMsg;BYTE *pbEncodedMsg;DWORD …

編譯esp32報錯解決辦法

報錯信息&#xff1a;CMake Error at build/CMakeFiles/git-data/grabRef.cmake:48 (file):file failed to open for reading (No such file or directory):這個錯誤是由于 Git 的安全檢查導致的。從錯誤信息可以看出&#xff0c;Git 檢測到了"可疑的所有權"&#xf…

【AI】常見8大LLM大語言模型地址

序號AI名稱地址1 ChatGPT &#xff08;OpenAI&#xff09;https://chat.openai.com/2Gemini (Google personal AI assistant)https://gemini.google.com/app3Grok (xAI Grok LLM)https://x.ai/4DeepSeek (DeepSeek AI chatbot)DeepSeek5Claude (Anthropic Claude AI)App unavai…

軟件系統的部署方式:單機、主備(冷主備、熱主備)、集群

一、單機部署單機部署是將軟件系統所有組件&#xff08;應用、數據庫等&#xff09;部署在單臺服務器上&#xff0c;架構簡單、成本低但存在單點故障風險&#xff0c;適用于低負載或測試場景。一臺服務器壞了&#xff0c;軟件系統無法服務。二、主備&#xff08;冷主備、熱主備…

從體驗到系統工程丨上手評測國內首款 AI 電商 App

作者&#xff1a;王晨&#xff08;望宸&#xff09; 產品界面&#xff0c;往往體現了產品的設計哲學&#xff0c;界面是產品的第一入口。 近期&#xff0c;1688 推出了 1688 AI App&#xff0c;這貌似是國內第一個電商領域的獨立 AI App 應用&#xff08;若不是&#xff0c;歡…

QML QQuickImage: Cannot open: qrc:/images/shrink.png(已解決)

此問題是 在 QT Quick 項目 顯示圖片的時候 遇到&#xff0c;顯示&#xff1a;QML QQuickImage: Cannot open: qrc:/images/shrink.png&#xff0c;不能 打開 圖片。為了解決此問題&#xff0c;找了很多資料&#xff0c;雖然是比較簡單&#xff0c;但對于初學者來說&#xff0c…

maven scope 詳解

Maven 的 scope用于定義依賴項在項目構建生命周期中的可見性和傳遞性&#xff0c;控制依賴在編譯、測試、運行等階段的可用性及是否被打包到最終產物中。以下是詳細解析&#xff1a;?? ??一、Scope 的核心作用????生命周期控制??決定依賴在編譯、測試、運行階段的可用…

Python的一次實際應用:利用Python操作Word文檔的頁碼

Python的一次實際應用&#xff1a;利用Python操作Word文檔的頁碼 需求&#xff1a;一次性處理24個文檔的頁碼。 文檔詳情&#xff1a; 1、每個word文檔包含800頁左右&#xff0c;每一頁包含一個標題和一張圖片。 2、由于圖片有橫排也有豎排&#xff0c;因此&#xff0c;每頁文檔…

Android15 GKI版本分析Kernel Crash問題

環境介紹編譯主機&#xff1a;amd64 Ubuntu 22.04Android源碼&#xff1a;Android15 GKIKernel版本&#xff1a;Linux 6.16Android構建系統&#xff1a;bazel構建工具鏈&#xff1a;gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-定位Linux…

rocky 9部署Zabbix監控

一、rocky安裝 需要注意在設置root用戶密碼時&#xff0c;勾選ssh遠程連接 安裝完成后直接用root登錄 1. 網絡配置 輸入nmtui 進入網絡配置界面 選擇 Edit a connection&#xff0c;再選擇接口 ens3 IPV4更改為Maual 手動模式 根據實際環境配置IP地址 重啟網絡 systemctl …

從9.4%到13.5%:ICDM2025錄取率觸底反彈,競爭壓力稍緩

近日&#xff0c;ICDM 2025公布了論文錄用結果。本次大會共收到785篇有效論文投稿&#xff0c;最終&#xff0c;共有106篇常規論文和70篇短論文被接收&#xff0c;總體接收率為22.4%&#xff0c;其中全文論文的接收率為13.5%。與前年9.4%、去年11.09%的錄取率相比&#xff0c;I…

linux上安裝methylkit -- 安全下車版 (正經版: Linux環境下安裝methylKit的實踐與避坑指南)

題外話&#xff1a; 我踩過的坑&#xff0c;都將成為我寫貼的素材&#xff01;(ㄒoㄒ) 整整安裝了兩天&#xff0c;這里面的滋味懂的都懂。 希望開發作者持續維護。 希望有人或者作者持續打包成sigularity鏡像使用&#xff0c;并且直接傳到github上&#xff0c;傳到docker上下…

【leetcode】114. 二叉樹展開為鏈表

文章目錄題目題解1. 遞歸2. 迭代3. 右指針重排&#xff0c;始終將右子樹添加到左子樹的最右題目 114. 二叉樹展開為鏈表 題解 1. 遞歸 先序遍歷然后將數組操作 for i in range(1, len(res)):prev, curr res[i - 1], res[i]prev.left Noneprev.right curr# Definition fo…

Vibe Coding、AI IDE/插件

概述 Vibe Coding&#xff0c;氛圍編程&#xff0c;AI輔助編程&#xff0c;三劍客&#xff1a; Google Gemini&#xff1a;OpenAI GPT&#xff1a;Anthropic Claude&#xff1a; IDE Cursor 基于VS Code開發。 特性&#xff1a; AI驅動的代碼生成&#xff1a;輸入想要的…

Unity高級UI拖動控制器教程

在游戲開發過程中&#xff0c;UI組件的拖動功能是一個常見的需求。特別是在需要實現拖動、邊界檢測、透明度控制以及動畫反饋等功能時&#xff0c;編寫一個高級UI拖動控制器將非常有用。在本文中&#xff0c;我們將創建一個支持多種Canvas模式和更精確邊界檢測的高級UI拖動控制…