矩陣路徑 LeetCode62 && LeetCode63 && LeetCode64

1. 矩陣的最小路徑和 LeetCode 64. Minimum Path Sum (Medium)

問題描述

Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path.
Note: You can only move either down or right at any point in time.
Example:
Input:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
Output: 7
Explanation: Because the path 1→3→1→1→1 minimizes the sum.

java實現

/*
sum[i][j]=
grid[i][j] i0 && j0 //左上角 沒有移動 最小值爲網格中的值
grid[i][j]+sum[i][j-1] i0 //在最上面一行,上一步爲左一個,向右一步到達,最小值爲到達左一個的最小值+網格中的值
grid[i][j]+sum[i-1][j] j
0 //在最左邊一行,上一步爲由上一個,向下一步到達,最小值爲到達上一個的最小值+網格中的值
Math.min(sum[i][j-1],sum[i-1][j])+grid[i][j] //上一步有兩種可能,sum[i][j-1]左一個(向右一步可以到達)和sum[i-1][j]上一個(向下一步可以到達),這兩種方式的最小值+網格中的值爲最小值。

*/
class Solution {
public int minPathSum(int[][] grid) {
int row = grid.length;
int col = grid[0].length;
if (row == 0 || col == 0)
return 0;
int[][] sum = new int[row][col];
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (i == 0 && j == 0)
sum[i][j] = grid[i][j];
else if (i == 0)
sum[i][j] = grid[i][j] + sum[i][j - 1];
else if (j == 0)
sum[i][j] = grid[i][j] + sum[i - 1][j];
else
sum[i][j] = Math.min(sum[i][j - 1], sum[i - 1][j]) + grid[i][j];
}
}
return sum[row - 1][col - 1];
}
}

2. 矩陣的總路徑數(無障礙) LeetCode62. Unique Paths (Medium)

問題

只能往下或者往右走,共多少中走法
A robot is located at the top-left corner of a m x n grid (marked ‘Start’ in the diagram below).

The robot can only move either down or right at any point in time. The robot is trying to reach the bottom-right corner of the grid (marked ‘Finish’ in the diagram below).

How many possible unique paths are there?

Example 1:

Input: m = 3, n = 2
Output: 3
Explanation:
From the top-left corner, there are a total of 3 ways to reach the bottom-right corner:

  1. Right -> Right -> Down
  2. Right -> Down -> Right
  3. Down -> Right -> Right
    Example 2:

Input: m = 7, n = 3
Output: 28

java實現

public class Solution {
public int uniquePaths(int m, int n) {
int[][] grid = new int[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (i == 0 || j == 0)
grid[i][j] = 1;//j=0在最上面一行,只能向右一直向走到達 i=0在最左邊,只能向下一直走到達
else
grid[i][j] = grid[i][j - 1] + grid[i - 1][j];
//grid[i][j-1]上一個(向下一步可以到達) grid[i-1][j]左一個(向右一步可以到達)
}
}
return grid[m - 1][n - 1];
}
}

3. 矩陣的總路徑數(有障礙) LeetCode 63 Unique Paths II(Medium)

問題描述

A robot is located at the top-left corner of a m x n grid (marked ‘Start’ in the diagram below).
The robot can only move either down or right at any point in time. The robot is trying to reach the bottom-right corner of the grid (marked ‘Finish’ in the diagram below).
Now consider if some obstacles are added to the grids. How many unique paths would there be?
An obstacle and empty space is marked as 1 and 0 respectively in the grid.
Note: m and n will be at most 100.
Example 1:
Input:
[
[0,0,0],
[0,1,0],
[0,0,0]
]
Output: 2
Explanation:
There is one obstacle in the middle of the 3x3 grid above.
There are two ways to reach the bottom-right corner:

  1. Right -> Right -> Down -> Down
  2. Down -> Down -> Right -> Right

java實現

class Solution {
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
int m = obstacleGrid.length;
int n = obstacleGrid[0].length;
int[][] grid = new int[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (obstacleGrid[i][j] == 1)//不能到達,直接設置爲0
grid[i][j] = 0;
else {
//可以到達 分情況
if (i == 0 && j == 0)
grid[i][j] = 1;
else if (i == 0)//i=0在最上面一行,由左一個向右一步到達
grid[i][j] = grid[i][j - 1];
else if (j == 0) //j=0在最左邊,由上一個向下一步到達
grid[i][j] = grid[i - 1][j];
else
grid[i][j] = grid[i][j - 1] + grid[i - 1][j];
//grid[i][j-1]左一個(向右一步可以到達) grid[i-1][j]上一個(向下一步可以到達)
}
}
}
return grid[m - 1][n - 1];
}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章