剑指 Offer 47. 礼物的最大价值

Posted on 2022-03-12 01:03  AcTourist  阅读(26)  评论(0)    收藏  举报

一、题目

 

二、理解

  1.看到这个题目我第一个反应是答案的位置为 [列的长度-1][行的长度-1],所以最终的答案要返回这个位置。

  2.第二个反应是:从左上角开始,往下或者往左进行,所以求出第一行每个位置当前最大值和第一列每个位置当前的最大值,为什么要这么弄做?因为我们就可以求出下一个位置当前最大值

  3.既然是二维数组,我想到另一个点是要用到双重for循环,再双重for循环 这里我理解错了(我理解了两个for同时进行)应该是外部for 循环一次 内部for循环n次

  4.例子题目3*3的矩形,答案的位置位于【2,2】,这样我们可以反推:它的左手边为【1,2】上边为【2,1】,再反推一下 是由 5 这个位置【1,1】与【1,2】或【2,1】相加得出【2,2】,综上所述我们可以得出一个位置公式:【n,m】 = 【n-1,m】或 【n,m-1】,这样我们看出这是一个斐波那契数列。

  5.根据4的理解和题目的要求,我们还得要加上当前位置的数字,得出最终公式是 grid[n][m] = grid[n][m] + Math.max(grid[n-1][m],grid[n][m-1)

三、代码

/**
 * @param {number[][]} grid
 * @return {number}
 */
var maxValue = function(grid) {
    let n = grid.length;
    let m = grid[0].length;

//求出第一行第一列位置里的当前最大值
    for ( let i = 1;i < n;i++) {
        grid[i][0] += grid[i-1][0];
    }

    for ( let i = 1;i < m;i++) {
        grid[0][i] += grid[0][i-1];
    }

//双重for循环,外for执行一次,内for就执行n次
//根据题目理解,答案返回的位置为【n-1】【m-1】
    for( let i = 1; i<n; i++){
        for( let j = 1; j<m; j++){
            grid[i][j] += Math.max(grid[i-1][j],grid[i][j-1]);
        }
    }

    return grid[n-1][m-1];

};