2.2 路徑問題專題:LeetCode 63. 不同路徑 II

動態規劃解決LeetCode 63題:不同路徑 II(含障礙物)

1. 題目鏈接

LeetCode 63. 不同路徑 II

2. 題目描述

一個機器人位于 m x n 網格的左上角,每次只能向右或向下移動一步。網格中可能存在障礙物(標記為 1),機器人不能經過障礙物。求從左上角到右下角的不同路徑總數。

示例 1
輸入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]
輸出:2
解釋:存在障礙物在中心位置,兩條路徑為:

  1. 右 -> 右 -> 下 -> 下
  2. 下 -> 下 -> 右 -> 右

示例 2
輸入:obstacleGrid = [[0,1],[0,0]]
輸出:1

3. 示例分析

示例 1 的輸入為例:

  • 機器人需要繞過中心的障礙物。
  • 動態規劃表 dp 在計算時會跳過障礙物位置,最終右下角的值為 2

4. 算法思路

動態規劃狀態定義

  • dp[i][j] 表示到達網格 (i-1, j-1) 位置的有效路徑數(ij1 開始,避免越界)。

狀態轉移方程

  • (i-1, j-1) 是障礙物,dp[i][j] = 0(無法到達)。
  • 否則,dp[i][j] = dp[i-1][j] + dp[i][j-1]

初始化技巧

  • 初始化 dp[0][1] = 1,使得 dp[1][1] 可以正確推導初始值,無需單獨處理第一行和第一列。

5. 邊界條件與注意事項

  1. 起點或終點為障礙物:直接返回 0
  2. 單行或單列網格:若路徑中存在障礙物,路徑數為 0
  3. 障礙物處理:遍歷時需跳過障礙物位置,保持 dp[i][j] = 0

6. 代碼實現(修正版)

class Solution {
public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {int m = obstacleGrid.size(), n = obstacleGrid[0].size();// 起點或終點是障礙物,直接返回0if (obstacleGrid[0][0] == 1 || obstacleGrid[m-1][n-1] == 1) return 0;vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));dp[0][1] = 1; // 初始化虛擬起點for (int i = 1; i <= m; i++) {for (int j = 1; j <= n; j++) {// 跳過障礙物位置if (obstacleGrid[i-1][j-1] == 0) {dp[i][j] = dp[i-1][j] + dp[i][j-1];}}}return dp[m][n];}
};

代碼解析

  1. 提前檢查障礙物:若起點或終點是障礙物,直接返回 0,避免無效計算。
  2. 動態規劃表填充:遍歷時跳過障礙物位置,保證路徑數不會累加無效值。
  3. 返回值dp[m][n] 表示到達右下角的有效路徑總數。

時間復雜度O(mn),空間復雜度:O(mn)。通過動態規劃表逐格計算,高效處理含障礙物的路徑問題。

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

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

相關文章

2874. 有序三元組中的最大值 II

給你一個下標從 0 開始的整數數組 。nums 請你從所有滿足 的下標三元組 中&#xff0c;找出并返回下標三元組的最大值。 如果所有滿足條件的三元組的值都是負數&#xff0c;則返回 。i < j < k(i, j, k)0 下標三元組 的值等于 。(i, j, k)(nums[i] - nums[j]) * nums[k…

【論文筆記】Llama 3 技術報告

Llama 3中的頂級模型是一個擁有4050億參數的密集Transformer模型&#xff0c;并且它的上下文窗口長度可以達到128,000個tokens。這意味著它能夠處理非常長的文本&#xff0c;記住和理解更多的信息。Llama 3.1的論文長達92頁&#xff0c;詳細描述了模型的開發階段、優化策略、模…

JVM深入原理(一+二):JVM概述和JVM功能

目錄 1. JVM概述 1.1. Java程序結構 1.2. JVM作用 1.3. JVM規范和實現 2. JVM功能 2.1. 功能-編譯和運行 2.2. 功能-內存管理 2.3. 功能-即時編譯 1. JVM概述 1.1. Java程序結構 1.2. JVM作用 JVM全稱是Java Virtual Machine-Java虛擬機 JVM作用:本質上是一個運行在…

SQL Server Integration Services (SSIS) 服務無法啟動

問題現象&#xff1a; 安裝 SQL Server 2022 后&#xff0c;SQL Server Integration Services (SSIS) 服務無法啟動&#xff0c;日志報錯 “服務無法響應控制請求”&#xff08;錯誤代碼 1067&#xff09;或 “依賴服務不存在或已標記為刪除”。 快速診斷 檢查服務狀態與依賴項…

Spring Boot 定時任務的多種實現方式

&#x1f31f; 前言 歡迎來到我的技術小宇宙&#xff01;&#x1f30c; 這里不僅是我記錄技術點滴的后花園&#xff0c;也是我分享學習心得和項目經驗的樂園。&#x1f4da; 無論你是技術小白還是資深大牛&#xff0c;這里總有一些內容能觸動你的好奇心。&#x1f50d; &#x…

Java基礎之反射的基本使用

簡介 在運行狀態中&#xff0c;對于任意一個類&#xff0c;都能夠知道這個類的所有屬性和方法&#xff1b;對于任意一個對象&#xff0c;都能夠調用它的任意屬性和方法&#xff1b;這種動態獲取信息以及動態調用對象方法的功能稱為Java語言的反射機制。反射讓Java成為了一門動…

AI產品的上層建筑:提示詞工程、RAG與Agent

上節課我們拆解了 AI 產品的基礎設施建設&#xff0c;這節課我們聊聊上層建筑。這部分是產品經理日常工作的重頭戲&#xff0c;包含提示詞、RAG 和 Agent 構建。 用 AI 客服產品舉例&#xff0c;這三者的作用是這樣的&#xff1a; 提示詞能讓客服很有禮貌。比如它會說&#x…

藍橋杯刷題記錄【并查集001】(2024)

主要內容&#xff1a;并查集 并查集 并查集的題目感覺大部分都是模板題&#xff0c;上板子&#xff01;&#xff01; class UnionFind:def __init__(self, n):self.pa list(range(n))self.size [1]*n self.cnt ndef find(self, x):if self.pa[x] ! x:self.pa[x] self.fi…

海外SD-WAN專線網絡部署成本分析

作為支撐企業國際業務的重要基石&#xff0c;海外SD-WAN專線以其獨特的成本優勢和技術特性&#xff0c;正成為企業構建高效穩定的全球網絡架構的首選方案。本文將從多維度解構海外SD-WAN專線部署的核心成本要素&#xff0c;為企業的全球化網絡布局提供戰略參考。 一、基礎資源投…

操作系統(二):實時系統介紹與實例分析

目錄 一.概念 1.1 分類 1.2 主要指標 二.實現原理 三.主流實時系統對比 一.概念 實時系統&#xff08;Real-Time System, RTS&#xff09;是一類以時間確定性為核心目標的計算機系統&#xff0c;其設計需確保在嚴格的時間約束內完成任務響應。 1.1 分類 根據時間約束的嚴…

Golang的消息中間件選型

# Golang的消息中間件選型 消息中間件的作用 消息中間件是一種用于分布式系統中應用程序之間進行通信的基礎架構工具&#xff0c;它能夠有效地解耦發送者和接收者&#xff0c;并提供高可用性和可靠性的消息傳遞機制。在Golang應用程序中&#xff0c;選擇適合的消息中間件對于構…

大模型中的參數規模與顯卡匹配

在大模型訓練和推理中&#xff0c;顯卡&#xff08;GPU/TPU&#xff09;的選擇與模型參數量緊密相關&#xff0c;需綜合考慮顯存、計算能力和成本。以下是不同規模模型與硬件的匹配關系及優化策略&#xff1a; 一、參數規模與顯卡匹配參考表 模型參數量訓練階段推薦顯卡推理階…

帶頭結點 的單鏈表插入方法(頭插法與尾插法)

帶頭結點的單鏈表插入方法&#xff08;頭插法與尾插法&#xff09; 在單鏈表的操作中&#xff0c;插入是最常見的操作之一&#xff0c;本文介紹 帶頭結點的單鏈表 如何實現 后插法 和 前插法&#xff08;包括 插入法 和 后插數據交換法&#xff09;&#xff0c;并提供完整的 C …

Prometheus的工作流程

Prometheus 是一個開源的監控和告警系統&#xff0c;專為監控分布式系統而設計。它的工作流程主要包括以下幾個關鍵步驟&#xff1a; 1. 數據采集 (Scraping) 目標發現 (Service Discovery)&#xff1a; Prometheus 自動或手動配置監控目標&#xff0c;通過 DNS、Kubernetes、…

軟件工程面試題(二十二)

1、常用的設計模式有哪些&#xff1f;并寫出一段程序代碼 Factory(工廠模式)&#xff0c;Adapter(適配器模式)&#xff0c;Singleton(單例模式)&#xff0c;State(狀態模式)&#xff0c;Observer(觀察者模式) 等。 單例模式 public class Singleton{ private static Singleton …

【Pandas】pandas DataFrame select_dtypes

Pandas2.2 DataFrame Attributes and underlying data 方法描述DataFrame.index用于獲取 DataFrame 的行索引DataFrame.columns用于獲取 DataFrame 的列標簽DataFrame.dtypes用于獲取 DataFrame 中每一列的數據類型DataFrame.info([verbose, buf, max_cols, …])用于提供 Dat…

如何利用ATECLOUD測試平臺的芯片測試解決方案實現4644芯片的測試?

作為多通道 DC-DC 電源管理芯片的代表產品&#xff0c;4644 憑借 95% 以上的轉換效率、1% 的輸出精度及多重保護機制&#xff0c;廣泛應用于航天航空&#xff08;衛星電源系統&#xff09;、醫療設備&#xff08;MRI 梯度功放&#xff09;、工業控制&#xff08;伺服驅動單元&a…

Python 編程實戰:打造高效便捷的目錄結構生成器

Python 編程實戰&#xff1a;打造高效便捷的目錄結構生成器 相關資源文件已經打包成EXE文件&#xff0c;可雙擊直接運行程序&#xff0c;且文章末尾已附上相關源碼&#xff0c;以供大家學習交流&#xff0c;博主主頁還有更多Python相關程序案例&#xff0c;秉著開源精神的想法&…

移動端六大語言速記:第6部分 - 錯誤處理與調試

移動端六大語言速記:第6部分 - 錯誤處理與調試 本文將對比Java、Kotlin、Flutter(Dart)、Python、ArkTS和Swift這六種移動端開發語言在錯誤處理與調試方面的特性,幫助開發者理解和掌握各語言的異常處理機制。 6. 錯誤處理與調試 6.1 異常處理 各語言異常處理的語法對比:…

PyTorch優化器

PyTorch 提供了多種優化算法用于神經網絡的參數優化。以下是對 PyTorch 中主要優化器的全面介紹&#xff0c;包括它們的原理、使用方法和適用場景。 一、基本優化器 1. SGD (隨機梯度下降) torch.optim.SGD(params, lr0.01, momentum0, dampening0, weight_decay0, nesterov…