63. 不同路径 II
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。
机器人试图达到网格的右下角(在下图中标记为 “Finish”)。
现在考虑网格中有障碍物。
那么从左上角到右下角将会有多少条不同的路径?
网格中的障碍物和空位置分别用 1 和 0 来表示。
说明:
m == obstacleGrid.length
n == obstacleGrid[i].length
1 <= m, n <= 100
obstacleGrid[i][j] 为 0 或 1
示例 1:
输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]
输出:2
解释:3x3 网格的正中间有一个障碍物。
从左上角到右下角一共有 2 条不同的路径:
1. 向右 -> 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右 -> 向右
示例 2:
输入:obstacleGrid = [[0,1],[0,0]]
输出:1
public class Solution { public int uniquePathsWithObstacles(int[][] obstacleGrid) { int m = obstacleGrid.length; int n = obstacleGrid[0].length; //int数组的初值为0 int[][] dp = new int[m][n]; //起始行有障碍物,则后续均无法到达 if (obstacleGrid[0][0] == 1||obstacleGrid[m-1][n-1] == 1)return 0; dp[0][0] = 1; //起始列有障碍物,则无法到达,直接返回0 for(int i=1;i<m;i++){ if(obstacleGrid[i][0] == 0) dp[i][0] = 1; else break; } //起始行有障碍物,则后续均无法到达 for(int j=1;j<n;j++){ if(obstacleGrid[0][j] == 0) dp[0][j] = 1; else break; } //因为dp的起始列行中无法达到的位置都为0 //所以,若存在多个障碍无法到达终点,则终点也为0 for(int i=1;i<m;i++) for(int j=1;j<n;j++){ if(obstacleGrid[i][j] == 0) dp[i][j] = dp[i-1][j] + dp[i][j-1]; } return dp[m-1][n-1]; } }
120. 三角形最小路径和
给定一个三角形 triangle ,找出自顶向下的最小路径和。
每一步只能移动到下一行中相邻的结点上。
相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。
也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标 i 或 i + 1 。
class Solution { /** * @author XiSoil * @date 2024/04/19 09:48 *执行分布用时3ms,击败的83.45%Java用户 *消耗内存分布43.14MB,击败的45.60%Java用户 **/ public int minimumTotal(List<List<Integer>> triangle) { int n = triangle.size(); int[][] dp = new int[n][n]; dp[0][0] = triangle.get(0).get(0); for (int i = 1; i < n; i++) { for (int j = 0; j <= i; j++) { if (j == 0) dp[i][j] = dp[i - 1][j] + triangle.get(i).get(j); else if (j == i) dp[i][j] = dp[i - 1][j - 1] + triangle.get(i).get(j); else dp[i][j] = Math.min(dp[i - 1][j - 1], dp[i - 1][j]) + triangle.get(i).get(j); } } int min = 10001; for (int i = 0; i < n; i++) { min = Math.min(min, dp[n - 1][i]); } return min; } }
931. 下降路径最小和
给你一个 n x n 的 方形 整数数组 matrix ,请你找出并返回通过 matrix 的下降路径 的 最小和 。
下降路径 可以从第一行中的任何元素开始,
并从每一行中选择一个元素。
在下一行选择的元素和当前行所选元素最多相隔一列(即位于正下方或者沿对角线向左或者向右的第一个元素)。
具体来说,位置 (row, col) 的下一个元素应当是 (row + 1, col - 1)、(row + 1, col) 或者 (row + 1, col + 1) 。
public class Solution { public int minFallingPathSum(int[][] matrix) { int m = matrix.length; int n = matrix[0].length; int min = Integer.MAX_VALUE; int[][] dp = new int[m][n]; for(int i= 0; i<m;i++){ dp[0][i] = matrix[0][i]; } for(int i=1;i<m;i++) for (int j=0;j<n;j++){ if(j==0) dp[i][j] = Math.min(dp[i-1][j],dp[i-1][j+1])+matrix[i][j]; else if(j==n-1) dp[i][j] = Math.min(dp[i-1][j],dp[i-1][j-1])+matrix[i][j]; else dp[i][j] = Math.min(dp[i-1][j-1],Math.min(dp[i-1][j],dp[i-1][j+1]))+matrix[i][j]; if (i == m-1) min = Math.min(min,dp[m-1][j]); } return min; } }