最小路径和(Java)

1.题目

给出一个 n * m的矩阵,每个点有一个权值,从矩阵左下走到右上(可以走四个方向),让你找到一条路径 使得该路径所路过的权值和最小,输出最小权值和

2.示例

示例一:

输入:[[1,1,1],[1,1,1],[1,1,1]]
输出:5
解释:(2,0)->(2,1)->(2,2)->(1,2)->(0,2),最小和时5。

示例二:

输入:[[2,3][3,2]]
输出:8
解释:(1,0)->(1,1)->(0,1),最小和是8。

3.案例源码

public class Solution {
    int[] dx = {0, 1, -1, 0};
    int[] dy = {1, 0, 0, -1};
    public int minPathSumII(int[][] matrix) {
        // Write your code here
        int n = matrix.length;
        int m = matrix[0].length;
        int[][] distance = new int[n][m];
        for(int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                distance[i][j] = Integer.MAX_VALUE;
            }
        }
        distance[n - 1][0] = matrix[n - 1][0];
        dfs(n - 1, 0, distance, matrix, matrix[n - 1][0], 0, m - 1);
        return distance[0][m - 1];
    }
    private void dfs(int stx, int sty, int[][] dis, int[][] matrix, int cursum, int edx, int edy) {
        dis[stx][sty] = cursum;
        int n = matrix.length;
        int m = matrix[0].length;
        for (int i = 0; i < 4; i++) {
            int nx = stx + dx[i];
            int ny = sty + dy[i];
            if (nx < 0 || nx >= n || ny < 0 || ny >= m || dis[nx][ny] < cursum + matrix[nx][ny]) {
                continue;
            }
            dfs(nx, ny, dis, matrix, cursum + matrix[nx][ny], 0, m - 1);
        }
    }
}

3.代码分析

1.定义了两个整型数组dx和dy,分别代表在矩阵中四个基本方向(上、下、左、右)的行和列增量。
2.minPathSumII方法是主入口,输入是一个二维整数矩阵,输出是最小路径和。
①.初始化一个同样大小的二维数组distance,用于记录从右上角到每个单元格的最小路径和,初始值设为Integer.MAX_VALUE。
②.设置矩阵右下角元素distance[n - 1][0]的值为其对应的矩阵值matrix[n - 1][0]。
③.从右下角出发,调用深度优先搜索(dfs)方法进行搜索。
④.返回distance矩阵左下角的值作为结果。
3.dfs方法实现了深度优先搜索算法。
①.输入参数包括当前位置坐标stx和sty、记录最小路径和的二维数组dis、原始矩阵matrix、当前路径和cursum以及可能未使用的edx和edy。
②.遍历四个方向,计算下一个可能的位置nx和ny。
③.检查新位置是否越界或新路径和是否小于已记录的最小路径和,如果满足条件则继续递归调用dfs方法。
整个过程通过深度优先搜索遍历所有可能的路径,并利用一个辅助矩阵distance记录从右上角到每个单元格的最小路径和,最终返回左下角单元格的最小路径和。

4.问题分析

此外,这段代码实现有一些问题: ①.dfs 函数中的边界条件可能不完整。如果直接使用 stx < 0 || stx >= n || sty < 0 || sty >= m 作为边界条件,可能会在某些情况下错过有效的递归路径。 ②.在更新 dis[nx][ny] 时,应该首先检查 nx 和 ny 是否在矩阵的范围内。 ③.distance[0][m - 1] 就是左上角到右下角的最小路径和,但是你可能需要从左下角或者右上角开始搜索,这样可能会有更好的性能。 ④.这段代码的核心思想是使用深度优先搜索来找到所有可能的路径,并更新最小路径和。但是实现上存在一些问题,需要进一步调试和优化。

  • 12
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值