剑指 Offer 47. 礼物的最大价值
图片转自 https://leetcode-cn.com/leetbook/read/illustration-of-algorithm/5vr32s/
遍历
执行用时:3 ms, 在所有 Java 提交中击败了77.52% 的用户 内存消耗:40.5 MB, 在所有 Java 提交中击败了99.04% 的用户
public class Solution {
// 从地图的左上角开始往右或往下走
// 使用 grid[i][j] 记录最大值
// 当 i == 0 & j == 0 时,grid[i][j] 等于本身
// 当 i == 0 & j != 0 时,grid[i][j] 只能等于上方块加自身
// 当 i != 0 & j == 0 时,grid[i][j] 只能等于左方块加自身
// 当 i != 0 & j != 0 时,grid[i][j] 等于左方块和上方块中较大值加自身
public int maxValue(int[][] grid) {
// 从上往下
for (int i = 0; i < grid.length; i++)
// 从左往右
for (int j = 0; j < grid[0].length; j++)
// 如果是 {0, 0}
if (i == 0 && j == 0) continue;
// 如果 i == 0 & j != 0 上方块加自身
else if (i == 0) grid[i][j] += grid[i][j - 1];
// 如果 i != 0 & j == 0 左方块加自身
else if (j == 0) grid[i][j] += grid[i - 1][j];
// 如果 i != 0 & j != 0 取左方块和上方块的较大值加自身
else grid[i][j] += Math.max(grid[i - 1][j], grid[i][j - 1]);
// 返回地图的右下角
return grid[grid.length - 1][grid[0].length - 1];
}
}
遍历,if 块的另外一种写法
执行用时:3 ms, 在所有 Java 提交中击败了77.52% 的用户 内存消耗:41 MB, 在所有 Java 提交中击败了68.73% 的用户
class Solution {
public int maxValue(int[][] grid) {
int totalRow = grid.length;
int totalCol = grid[0].length;
for (int i = 0; i < totalRow; i++) {
for (int j = 0; j < totalCol; j++) {
int curValue = grid[i][j];
if (i > 0 && j > 0) {
grid[i][j] = Math.max(grid[i - 1][j], grid[i][j - 1]) + curValue;
} else if (i > 0) {
grid[i][j] = curValue + grid[i - 1][j];
} else if (j > 0) {
grid[i][j] = curValue + grid[i][j - 1];
}
}
}
return grid[totalRow - 1][totalCol - 1];
}
}