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?
LeetCode中的变形题目:Minimum Path Sum , Unique Paths II(障碍物)
题目意思 : m x n 矩阵 ,从 00 到 (m-1)(n-1)有多少种走法
思路 : 可以先假设3x3的矩阵,用树形图画出对应的可能路线图,00 = 01+10 , 01 = 02 + 11 , 02 = 12 =22 ,11 = 12 + 21 ,12 = 22 ,21 =22
所以 , 可以知道这个问题的子问题就是 矩阵中 matrix[i][j]到终点的路线。
得到递推式 :
W(R , D) = W(R + 1 , D) + W(R , D+1) D,R < m - 1 , n -1; W(R , D) = W(R + 1 , D) D = n - 1 W(R , D) = W(R , D + 1) R = m - 1
public class Solution { public int uniquePaths(int m, int n) { int[][] matrix = new int[m][n]; // 存放每一个点到终点的路线 for (int i = m - 1 ; i >= 0 ; i--) { for (int j = n - 1 ; j >= 0 ; j--) { if ( i == m - 1 && j == n - 1) matrix[i][j] = 1; else if (j < n - 1 && i < m - 1 ) matrix[i][j] = matrix[i + 1][j] + matrix[i][j + 1]; else if (j == n - 1) matrix[i][j] = matrix[i + 1][j]; else matrix[i][j] = matrix[i][j + 1]; } } return matrix[0][0]; } }
DISCUSS 中排列组合方法 :
总共 m - 1次 down ,n - 1 right 所以 C(n - 1 + m - 1 , m - 1); 得到了下面的:
public int uniquePaths(int m, int n) { if( m == 1 || n ==1) return 1; long count = 1; if(m>n){ for(int i=1; i<=n-1; i++){ count *= (m + i - 1); count /= i; } }else{ for(int i=1; i<=m-1; i++){ count *= (n + i - 1); count /= i; } } return (int)count; }
第二种类型 : 表格中添加障碍物 值为1的不能通过 :
思路: 很简单,只要在第一种的动态规划解法中,添加一些判断条件就可以了
public class Solution { // 添加了障碍物 1的格不能通过 public int uniquePathsWithObstacles(int[][] obstacleGrid) { int m = obstacleGrid.length; int n = obstacleGrid[0].length; if(obstacleGrid[m-1][n-1] == 1 || obstacleGrid[0][0] == 1) return 0; int[][] matrix = new int[m][n]; for (int i = m - 1 ; i >= 0 ; i--) { for (int j = n - 1 ; j >= 0 ; j--) { if(obstacleGrid[i][j] == 1) matrix[i][j] = 0; // 多了这句话 else if ( i == m - 1 && j == n - 1) matrix[i][j] = 1; else if (j < n - 1 && i < m - 1 ) matrix[i][j] = matrix[i + 1][j] + matrix[i][j + 1]; //注意这里你不要判断右边或下面的是否为1,因为它们的值反正0 , 没关系的 else if (j == n - 1) matrix[i][j] = matrix[i + 1][j]; else matrix[i][j] = matrix[i][j + 1]; } } return matrix[0][0]; } }
相关推荐
1、记忆化 2、二维dp 3、滚动优化
javascript js_leetcode题解之62-unique-paths.js
public static int uniquePaths(int rows, int cols, int[][] grid) { int[][] dp = new int[rows][cols]; // 初始化第一列全部为1,表示只有一条路径到达每个点 for (int i = 0; i ; i++) { if (grid[i][0] =...
javascript js_leetcode题解之63-unique-paths-ii.js
44. Unique Paths II:与 Unique Paths 类似,但是考虑网格中障碍物的处理。 45. Maximum Sum Subarray:找出一个数字序列中和最大的连续子序列。 46. Maximum Product Subarray:找出一个数字序列中乘积最大的连续...
- "不同路径"(Unique Paths)和"不同路径 II"(Unique Paths II)同样是关于路径计算的动态规划问题。 **二分搜索(Binary Search)** 二分搜索算法适用于有序数组或列表的快速查找问题。 - "搜索插入位置"...
44. Unique Paths II:不同路径数的计算,其中包含障碍物。 45. Maximum Sum Subarray:计算子数组的最大和。 46. Maximum Product Subarray:计算子数组的最大乘积。 47. Coins in a Line:动态规划解决博弈问题,...
Unique Paths Unique Paths II Longest Palindromic Substring Interleaving String Triangle Distinct Subsequences Decode Ways Palindrome Partitioning II Maximal Rectangle ###Recursion N-Queens N-Queens II...
def uniquePaths(m, n): dp = [[1] * n] + [[1] + [0] * (n - 1) for _ in range(m - 1)] for i in range(1, m): for j in range(1, n): dp[i][j] = dp[i - 1][j] + dp[i][j - 1] return dp[m - 1][n - 1] ``...
例如,"Unique Paths"(不同路径)和"House Robber"(打家劫舍)都是经典的动态规划题目。 3. **回溯与深度优先搜索**:这类算法通常用于解决组合优化问题和图遍历问题。例如,"N-Queens"(八皇后问题)和"Word ...
- Unique Paths(不同路径) 11. Binary Search(二分查找): 二分查找是一种在有序数组中查找特定元素的搜索算法。文件中出现的二分查找相关题目包括: - Search Insert Position(搜索插入位置) - Find ...
int uniquePaths(int m, int n) { if(!n || !m) return 0; vector<vector<int>>f(m + 1, vector(n + 1)); f[0][0] = 1; for(int i = 0; i ; i++) for(int j = 0; j ; j++){ if(!i && !j) continue; if(i) f...
- Unique Paths / Unique Paths II: 前者计算从矩阵的左上角到右下角的路径数量;后者则考虑了障碍物。 - Minimum Path Sum: 在一个m×n的网格中,找到从左上角到右下角的路径,使得路径上的数字总和最小。 - Plus ...
2. **不同路径(Unique Paths)**:给定一个机器人位于一个m x n网格的左上角,求出到达网格右下角的不同路径数量。 ### 二分查找 二分查找是解决有序数组或列表中特定问题的有效算法。 1. **搜索插入位置(Search...
62.Unique Paths, 63.Unique Paths II, 64.Minimum Path Sum 2017/03/09 70.Climbing Stairs, 198.House Robber, 55.Jump Game 72.Edit Distance, 97.Interleaving String, 115.Distinct Subsequences 2017/04/24 ...
- **Unique Paths**:计算机器人到达目标位置的唯一路径数。 - **Maximum Subarray**:寻找数组中的最大子数组和。 - **Climbing Stairs**:模拟爬楼梯,每次可以爬1阶或2阶。 5. **回溯(Backtracking)**: -...
3. **Unique Paths** (唯一路径) 给定一个矩阵,每一步可以向右或向下移动,求从左上角到右下角的不同路径数。状态转移方程为`dp[i][j] = dp[i-1][j] + dp[i][j-1]`。 4. **Minimum Path Sum** (最小路径和) 从...
Unique Paths II **知识点:** - **问题描述:** - 同 62 题,但网格中存在障碍物。 - **解决方案分析:** - **动态规划:** - 定义 `dp[i][j]` 表示到达 `(i, j)` 的路径数量。 - 如果当前位置有障碍物,则...