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

image.png
image.png

图片转自 https://leetcode-cn.com/leetbook/read/illustration-of-algorithm/5vr32s/

遍历

执行用时:3 ms, 在所有 Java 提交中击败了77.52% 的用户 内存消耗:40.5 MB, 在所有 Java 提交中击败了99.04% 的用户

  1. public class Solution {
  2. // 从地图的左上角开始往右或往下走
  3. // 使用 grid[i][j] 记录最大值
  4. // 当 i == 0 & j == 0 时,grid[i][j] 等于本身
  5. // 当 i == 0 & j != 0 时,grid[i][j] 只能等于上方块加自身
  6. // 当 i != 0 & j == 0 时,grid[i][j] 只能等于左方块加自身
  7. // 当 i != 0 & j != 0 时,grid[i][j] 等于左方块和上方块中较大值加自身
  8. public int maxValue(int[][] grid) {
  9. // 从上往下
  10. for (int i = 0; i < grid.length; i++)
  11. // 从左往右
  12. for (int j = 0; j < grid[0].length; j++)
  13. // 如果是 {0, 0}
  14. if (i == 0 && j == 0) continue;
  15. // 如果 i == 0 & j != 0 上方块加自身
  16. else if (i == 0) grid[i][j] += grid[i][j - 1];
  17. // 如果 i != 0 & j == 0 左方块加自身
  18. else if (j == 0) grid[i][j] += grid[i - 1][j];
  19. // 如果 i != 0 & j != 0 取左方块和上方块的较大值加自身
  20. else grid[i][j] += Math.max(grid[i - 1][j], grid[i][j - 1]);
  21. // 返回地图的右下角
  22. return grid[grid.length - 1][grid[0].length - 1];
  23. }
  24. }

遍历,if 块的另外一种写法

执行用时:3 ms, 在所有 Java 提交中击败了77.52% 的用户 内存消耗:41 MB, 在所有 Java 提交中击败了68.73% 的用户

  1. class Solution {
  2. public int maxValue(int[][] grid) {
  3. int totalRow = grid.length;
  4. int totalCol = grid[0].length;
  5. for (int i = 0; i < totalRow; i++) {
  6. for (int j = 0; j < totalCol; j++) {
  7. int curValue = grid[i][j];
  8. if (i > 0 && j > 0) {
  9. grid[i][j] = Math.max(grid[i - 1][j], grid[i][j - 1]) + curValue;
  10. } else if (i > 0) {
  11. grid[i][j] = curValue + grid[i - 1][j];
  12. } else if (j > 0) {
  13. grid[i][j] = curValue + grid[i][j - 1];
  14. }
  15. }
  16. }
  17. return grid[totalRow - 1][totalCol - 1];
  18. }
  19. }