64. 最小路径和(leetcode)

题目描述:

示例 :

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

知识点:动态规划、深度优先搜索

解题思路:

        本题可直接用for循环求出每个点的从开头到当前点的最短路径,状态转移方程很容易写。我们试一下用DFS来求解此题。

        我们需要一个用来标记的数组,一般是通过01来标记一个点是否已经经过防止在一条路径中经过相同的点,但这样操作需要在此次路径结束时进行回溯防止别的路径不能经过这些点。今天的解法没有使用这种标记方式,我们通过使用一个二维数组来标记每个点到达终点的最小路径和。

        首先考虑递归函数:

        入参为要遍历的二维数组,以及用来表示当前点坐标的i 和 j。返回值为当前点到达终点的最小路径和,所以在递归中有后面点的最小和求得当前点的最小和,并将其写入标记数组中。最终得到起点到终点的最小路径和。 由于要求最短路经,所以在递归的时候我们只需要考虑当前点向右以及向下移动以及右边界与下边界(因为上边界与下边界取不到,我们不向这两个方向进行递归),

        其次考虑递归的终止条件:

        1.当坐标超出数组边界时,此时代表此路不通,要返回一个无法被取到的值,直接返回一个极大值。

        2.当坐标到达右下角目标点位,此时到达终点,直接返回终点坐标的值。

        3.当坐标走到已经被标记的点位,该点的标记值即该点到达终点的最小值,所以直接返回该值即可。

       

        最后考虑递推公式

        因为我们要通过递归来求得起点到达终点的最小路径和,所以我们要通过递推来找到当前点能到达的下一点中到达终点的最小路径和,在加上当前点的值即该点到达终点的最小路径和。

        

class Solution {
    int[][] visited;
    public int minPathSum(int[][] grid) {
        visited = new int[grid.length][grid[0].length];
        return dfs(grid, 0, 0);
    }
    private int dfs(int[][] grid, int i, int j) {
        if (i >= grid.length || j >= grid[0].length) return Integer.MAX_VALUE;
        if (visited[i][j] != 0) return visited[i][j];
        if (i == grid.length - 1 && j== grid[0].length - 1) return grid[grid.length - 1][grid[0].length - 1];
        int temp = Math.min(dfs(grid, i, j + 1), dfs(grid, i + 1, j)) + grid[i][j];
        visited[i][j] = temp;
        return temp;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值