演算法——路徑問題
路徑總數
題目描述:
在一個m*n的網格的左上角有一個機器人,機器人在任何時候只能向下或者向右移動,機器人試圖到達網格的右下角,有多少可能的路徑。
來源:牛客連結
思路:動態規劃
F(i,j) = F(i-1,j) + F(i,j-1)
特殊情況:第0行和第0列
F(0,i) = 1
F(i,0) = 1
程式碼:
import java.util.*;
public class Solution {
/**
* @param m int整型
* @param n int整型
* @return int整型
*/
public int uniquePaths(int m, int n) {
// write code here
List<List<Integer>> pathNum = new ArrayList<>();
// 申請F(i,j)空間,初始化
for (int i = 0; i < m; ++i) {
pathNum.add(new ArrayList<>());
pathNum.get(i).add(1);
}
for (int i = 1; i < n; ++i) {
pathNum.get(0).add(1);
}
for (int i = 1; i < m; ++i) {
for (int j = 1; j < n; ++j) {
// F(i,j) = F(i-1,j) + F(i,j-1)
pathNum.get(i).add(pathNum.get(i).get(j - 1) + pathNum.get(i - 1).get(j));
}
}
return pathNum.get(m - 1).get(n - 1);
}
}
路徑總數(有障礙物)
題目描述:
繼續求路徑。
如果在圖中加入了一些障礙,有多少不同的路徑?
分別用0和1代表空區域和障礙
來源:牛客連結
思路:動態規劃
F(i,j) = {F(i-1,j) + F(i,j-1)} OR {0, if obstacleGrid(i,j) = 1}
特殊情況:第0行和第0列
F(0,i) = {1} OR {0, if obstacleGrid(0,j) = 1, j <= i}
F(i,0) = {1} OR {0, if obstacleGrid(j,0) = 1, j <= i}
程式碼:
package java_1004;
import java.util.*;
public class Solution {
/**
*
* @param obstacleGrid int整型二維陣列
* @return int整型
*/
public int uniquePathsWithObstacles (int[][] obstacleGrid) {
// write code here
if(obstacleGrid==null)return 0;
List<List<Integer>> pathNum = new ArrayList<>();
int m = obstacleGrid.length;
int n = obstacleGrid[0].length;
// 申請F(i,j)空間,初始化
// 初始化第0列
for (int i = 0; i < m; ++i) {
pathNum.add(new ArrayList<>());
//如果當前位置有障礙,則無法到達
if (obstacleGrid[i][0] == 1)
pathNum.get(i).add(0);
else {
//如果當前位置無障礙,但是前面如果到達不了,當前位置也達到不了
if (i > 0) {
if (pathNum.get(i - 1).get(0) == 1)
pathNum.get(i).add(1);
else
pathNum.get(i).add(0);
} else
pathNum.get(i).add(1);
}
}
//初始化第一行
for (int i = 1; i < n; ++i) {
if (obstacleGrid[0][i] == 1)
pathNum.get(0).add(0);
else {
if (pathNum.get(0).get(i - 1) == 1)
pathNum.get(0).add(1);
else
pathNum.get(0).add(0);
}
}
for (int i = 1; i < m; ++i) {
for (int j = 1; j < n; ++j) {
// obstacleGrid[i][j] = 1 時,F(i,j)無法到達
if (obstacleGrid[i][j] == 1)
pathNum.get(i).add(0);
else
// F(i,j) = F(i-1,j) + F(i,j-1)
pathNum.get(i).add(pathNum.get(i).get(j - 1)
+ pathNum.get(i - 1).get(j));
}
}
return pathNum.get(m - 1).get(n - 1);
}
}
最小路徑和(左上角到右下角)
題目描述
給定一個由非負整數填充的m x n的二維陣列,現在要從二維陣列的左上角走到右下角,請找出路徑上的所有數字之和最小的路徑。
注意:你每次只能向下或向右移動。
來源:牛客連結
思路:動態規劃
F(i,j) = min{F(i-1,j) , F(i,j-1)} + F(i,j)
特殊情況:第0行和第0列
F(0,i) = F(0,i-1) + (0,i)
F(i,0) = F(i-1,0) + (i,0)
程式碼:
import java.util.*;
public class Solution {
/**
*
* @param grid int整型二維陣列
* @return int整型
*/
public int minPathSum (int[][] grid) {
// write code here
int row = grid.length;
int col = grid[0].length;
// 如果為空或者只有一行,返回0
if(row == 0 || col == 0) {
return 0;
}
// F(0,0), F(0,i), F(i,0)初始化
for(int i = 1;i < row;i++) {
grid[i][0] = grid[i - 1][0] + grid[i][0];
}
for(int i = 1;i < col;i++) {
grid[0][i] = grid[0][i - 1] + grid[0][i];
}
// F(i,j) = min{F(i-1,j) , F(i,j-1)} + F(i,j)
for(int i=1;i < row;i++){
for(int j = 1;j < col;j++) {
grid[i][j] = Math.min(grid[i - 1][j],grid[i][j - 1]) + grid[i][j];
}
}
return grid[row-1][col-1];
}
}
相關文章
- 路徑問題
- [最短路徑問題]Dijkstra演算法(含還原具體路徑)演算法
- 遞迴路徑問題遞迴
- 資源路徑問題
- 最短路徑問題 (dijkstra演算法)演算法
- 檔案路徑問題( ./ 和 ../ 和 @/ )
- VsCode相對路徑的問題VSCode
- django建立的專案路徑問題Django
- 解決pdf.js路徑問題JS
- 課時23.路徑問題(理解)
- python中的路徑問題彙總Python
- laravel上傳圖片路徑問題Laravel
- python 當前路徑和導包路徑問題全解析Python
- ThinkPHP 訪問路徑隱藏 index.php 問題PHPIndex
- vue 關於圖片路徑的問題Vue
- 遷移Qt專案的路徑問題QT
- webpack:url-loader 圖片路徑問題Web
- Windows程式讀取不了中文路徑問題Windows
- 【Django】檔案讀取時路徑問題Django
- 使用A*演算法解迷宮最短路徑問題演算法
- 路徑規劃: 淺談路徑規劃演算法演算法
- vue render載入img的src路徑問題Vue
- Python大資料分析學習.路徑問題Python大資料
- anaconda中python環境路徑衝突問題Python
- Oracle 訪問路徑Oracle
- JavaWeb中讀取【專案路徑下檔案】的路徑問題:this.getServletContext().getRealPath()JavaWebServletContext
- [提問交流]關於後臺選單欄路徑問題!
- python實現Dijkstra演算法之 最短路徑問題Python演算法
- asp.net ckfinder 圖片不同host路徑問題ASP.NET
- 【填坑指南】webpack圖片路徑與打包問題Web
- windows 安裝python後pip安裝路徑問題WindowsPython
- 最短路徑問題
- jenkins 修改訪問路徑Jenkins
- 路徑規劃之A*演算法演算法
- Java 專案讀取 resource 資原始檔路徑問題Java
- 路徑查詢演算法應用之A*演算法演算法
- python呼叫程式路徑中包空格,及包含特殊字元問題Python字元
- 每日一道演算法題--leetcode 112--路徑總和--python演算法LeetCodePython