“Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。”
62. 不同路径
一、题目描述:
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
二、思路分析:
- 动态规划, 到达任一网格的路径数量等于到达它上面和左边的路径数量之和
二维 dp 数组可以压缩为一维的dp数组
三、AC 代码:
class Solution {
public int uniquePaths(int m, int n) {
int[] dp = new int[n];
Arrays.fill(dp, 1);
for(int i = 1; i <m;i++){
for(int j = 1; j < n; j++){
dp[j] += dp[j - 1];
}
}
return dp[n - 1];
}
}
64. 最小路径和
一、题目描述:
给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明: 每次只能向下或者向右移动一步。
输入: grid = [[1,3,1],[1,5,1],[4,2,1]]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小。
二、思路分析:
- 动态规划, 到达任一网格的路径和 等于到达它上面和左边的路径和较小的一个 再加上自身网格的数值
二维 dp 数组可以压缩为一维的dp数组
三、AC 代码:
class Solution {
public int minPathSum(int[][] grid) {
int m = grid.length;
int n = grid[0].length;
int[] dp =new int[n];
for(int j = 0; j < n; j++){
dp[j] = grid[0][j];
dp[j] += j > 0 ? dp[j - 1] : 0;
}
for(int i = 1; i < m; i++){
for(int j = 0; j < n; j++){
dp[j] = j > 0? Math.min(dp[j - 1], dp[j]) : dp[j];
dp[j]+=grid[i][j];
}
}
return dp[n - 1];
}
}