美文网首页剑指 Offer Java版
剑指Offer Java版 面试题47:礼物的最大价值

剑指Offer Java版 面试题47:礼物的最大价值

作者: 孙强Jimmy | 来源:发表于2019-08-01 20:06 被阅读0次

题目:在一个m×n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格,直到到达棋盘的右下角。给定一个棋盘及其上面的礼物,请计算你最多能拿到多少价值的礼物?

例如,在下面的棋盘中,如果沿着加粗的数字的线路(1、12、5、7、7、16、5),那么我们能拿到最大价值为53的礼物。

1     10   3    8
12   2    9    6
5    7    4    11
3    7    16   5

参考答案

public int getMaxValueSolution1(int[][] values) {
    if (values == null || values.length == 0) {
        return 0;
    }
    int[][] maxValues = new int[values.length][values[0].length];
    for (int i = 0; i < values.length; i++) {
        for (int j = 0; j < values[i].length; j++) {
            int left = 0, top = 0;
            if (i > 0) {
                top = maxValues[i - 1][j];
            }
            if (j > 0) {
                left = maxValues[i][j - 1];
            }
            maxValues[i][j] = Math.max(left, top) + values[i][j];
        }
    }
    return maxValues[maxValues.length - 1][maxValues[0].length - 1];
}

复杂度分析

  • 时间复杂度:O(mn)。
  • 空间复杂度:O(mn)。

优化之后的代码

public int getMaxValueSolution2(int[][] values) {
    if (values == null || values.length == 0) {
        return 0;
    }
    int[] maxValues = new int[values[0].length];
    for (int i = 0; i < values.length; i++) {
        for (int j = 0; j < values[i].length; j++) {
            int left = 0, top = 0;
            if (i > 0) {
                top = maxValues[j];
            }
            if (j > 0) {
                left = maxValues[j - 1];
            }
            maxValues[j] = Math.max(left, top) + values[i][j];
        }
    }
    return maxValues[maxValues.length - 1];
}

复杂度分析

  • 时间复杂度:O(mn)。
  • 空间复杂度:O(n)。

👉剑指Offer Java版目录
👉剑指Offer Java版专题

相关文章

网友评论

    本文标题:剑指Offer Java版 面试题47:礼物的最大价值

    本文链接:https://www.haomeiwen.com/subject/utzcdctx.html