leecode 64.最小路径和

83 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情

给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

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

输入:grid = [[1,3,1],[1,5,1],[4,2,1]]

输出:7

解释:因为路径 1→3→1→1→1 的总和最小。

思路:

这道题中,我们需要寻求到达右下角位置的路径中数字总和最小的路径,因为每次都只能向下或者向右移动一步,所以要想到达右下角[2,2]位置,只能是[2,1]或者[1,2]这两个位置,他们两个中路径和较小的那个则就是最小路径和的路径,而这两个位置分别又只能通过[0,2][1,1][2,0]这三个位置分别到达,这样下来,我们就可以将到达[2,2]位置的最小路径分解成两个更小的问题,然后这样我们就将一个问题分解成许多个小问题。

我们就可以通过递归的方式来逐步计算每一个位置的最小路径和然后进行比较,最终得出右下角位置的最小路径和

var minPathSum = function(grid) {
    let i = grid.length-1
    let j = grid[i].length-1
    let arr = []
    for(let num = 0;num<=i;num++){
        arr[num] = []
    }
    for(let num = 0;num<=i;num++){
        for(let col = 0;col<=j;col++){
            if(!num&&!col){
                arr[0][0] = grid[0][0]
                continue
            }
            if(num===0){
                arr[num][col] = arr[num][col-1]+grid[num][col]
                continue
            }
            if(col===0){
                arr[num][col] = arr[num-1][col]+grid[num][col]
                continue
            }
            arr[num][col] = Math.min(arr[num-1][col],arr[num][col-1])+grid[num][col]
        }
    }
    return arr[i][j]
};

这种方式属于暴力解法也即穷举法,并且会造成很多重复的计算,在时间复杂度上非常不好,就像[1,1]的值在计算[2,1]和[1,2]两个位置的时候都会用到,而在这种解法中则会对[1,1]位置进行两次计算,会造成性能的浪费,我们可以通过使用增加备忘录的方式来记录沿途计算过的点位,并进行复用,这样可以大大降低性能的消耗