🔥 LeetCode 热题 HOT 100: 62 && 64

104 阅读1分钟

“Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。”

62. 不同路径

一、题目描述:

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。

问总共有多少条不同的路径?

image.png  

二、思路分析:

  • 动态规划, 到达任一网格的路径数量等于到达它上面和左边的路径数量之和

二维 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 ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

说明: 每次只能向下或者向右移动一步。

image.png

输入: grid = [[1,3,1],[1,5,1],[4,2,1]]
输出: 7
解释: 因为路径 13111 的总和最小。

二、思路分析:

  • 动态规划, 到达任一网格的路径和 等于到达它上面和左边的路径和较小的一个 再加上自身网格的数值

二维 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];
    }
}