题目

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

思路1

  • 因为是要求最大价值,而且只能移动下方或者右方,因此,每个位置的最大值就是本身的值加上上边 / 左边 中的最大值,然后每次遍历都可以复用上一次的值。因此我们可以得到状态转移方程:

    • $ dp[i][j]=\begin{matrix} max(dp[i-1][j], dp[i][j-1]) + grid[i][j] \end{matrix} $
  • 我们可以创建一个行和列都要多一行的 dp 数组,这样子可以不用判断条件了,但是同时也要注意 grid 中的坐标都要减去 1,因为我们是从 1 开始的:

代码

class Solution {
public int maxValue(int[][] grid) {
int row = grid.length;
int col = grid[0].length;
// 创建dp数组,让 row 和 col 都多创建一行就可以避免判断边界值问题
int dp[][] = new int[row+1][col+1]; for (int i = 1; i <= row; i++) {
for (int j = 1; j <= col; j++) {
// 这里的 grid 中 i-1 和 j-1 是因为我们是从 1 开始的,所以要减去 1 才是原始正确的位置
dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]) + grid[i-1][j-1];
}
} // 最后直接返回数组右下角值即可
return dp[row][col];
}
}

复杂度分析

  • 时间复杂度:\(O(MN)\),
  • 空间复杂度:\(O(MN)\),创建 dp 数组所花费的空间

思路2

  • 然后我们可以优化一下,因为只能左走或者右走,因此第一行和第一列是固定的一条路,我们可以事先初始化计算一下第一行和第一列,到时就不用计算了。因此直接在原数组上直接进行就可以了

代码

class Solution {
public int maxValue(int[][] grid) {
int row = grid.length;
int col = grid[0].length; // 先初始化边界
for (int i = 1; i < row; i++) {
grid[i][0] += grid[i-1][0];
}
for (int i = 1; i < col; i++) {
grid[0][i] += grid[0][i-1];
} // 遍历
for (int i = 1; i < row; i++) {
for (int j = 1; j < col; j++) {
// 选择左边或者上边
grid[i][j] += Math.max(grid[i-1][j], grid[i][j-1]);
}
} // 最后直接返回数组右下角值即可
return grid[row-1][col-1];
}
}

复杂度分析

  • 时间复杂度:\(O(MN)\),
  • 空间复杂度:\(O(1)\),无需创建 dp 数组

力扣 - 剑指 Offer 47. 礼物的最大价值的更多相关文章

  1. 【Java】 剑指offer(47) 礼物的最大价值

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 在一个m×n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值( ...

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

    题目描述 在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0).你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格.直到到达棋盘的右下角.给定一个棋盘及 ...

  3. 每日一题 - 剑指 Offer 47. 礼物的最大价值

    题目信息 时间: 2019-07-02 题目链接:Leetcode tag:动态规划 难易程度:中等 题目描述: 在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0). ...

  4. 刷题-力扣-剑指 Offer II 055. 二叉搜索树迭代器

    剑指 Offer II 055. 二叉搜索树迭代器 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/kTOapQ 著作权归领扣网络所有 ...

  5. 刷题-力扣-剑指 Offer 15. 二进制中1的个数

    剑指 Offer 15. 二进制中1的个数 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/er-jin-zhi-zhong-1de- ...

  6. 刷题-力扣-剑指 Offer 42. 连续子数组的最大和

    剑指 Offer 42. 连续子数组的最大和 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/lian-xu-zi-shu-zu-de ...

  7. 力扣 - 剑指 Offer 09. 用两个栈实现队列

    目录 题目 思路 代码 复杂度分析 题目 剑指 Offer 09. 用两个栈实现队列 思路 刚开始想的是用stack1作为数据存储的地方,stack2用来作为辅助栈,如果添加元素直接push入stac ...

  8. 力扣 - 剑指 Offer 37. 序列化二叉树

    目录 题目 思路 代码 复杂度分析 题目 剑指 Offer 37. 序列化二叉树 思路 序列化其实就是层序遍历 但是,要能反序列化的话,前.中.后.层序遍历是不够的,必须在序列化时候保存所有信息,这样 ...

  9. 力扣 - 剑指 Offer 17. 打印从1到最大的n位数

    题目 剑指 Offer 17. 打印从1到最大的n位数 思路1 如果有n位,那么最大值就是\(10^n-1\),即如果n是2,那么最大就到输出到99 考虑到大数情况,所以使用字符数组 还要把字符数组转 ...

随机推荐

  1. sqlmap--tamper使用技巧

    apostrophemask.py 适用数据库:ALL 作用:将引号替换为utf-8,用于过滤单引号 使用脚本前: tamper("1 AND '1'='1") 使用脚本后: 1A ...

  2. Java:AQS 小记-2(ReentrantLock)

    Java:AQS 小记-2(ReentrantLock) 整体结构 ReentrantLock 类图 AbstractOwnableSynchronizer 类 public abstract cla ...

  3. Flutter的环境配置以及一些常见问题

    flutter & AndroidStudio flutter的下载与配置 flutter是Google推出的基于Dart语言开发的跨平台开源UI框架,能够支持安卓与iOS. flutter框 ...

  4. [BZOJ3307] 雨天的尾巴-----------------线段树进阶

    虽然是个板子,但用到了差分思想. Description N个点,形成一个树状结构.有M次发放,每次选择两个点x,y对于x到y的路径上(含x,y)每个点发一袋Z类型的物品.完成所有发放后,每个点存放最 ...

  5. 计算机网络之网络层移动IP

    文章转自:https://blog.csdn.net/weixin_43914604/article/details/105319753 学习课程:<2019王道考研计算机网络> 学习目的 ...

  6. Jquery校验中国身份证号码是否正确

    在项目中使用表单时经常会涉及到身份证号码是否正确的校验,下面看看应该中国二代身份证号码应该怎么用Jquery校验呢? 二代身份证校验码的计算方法 二代身份证由17位数字和一位校验码组成,那么校验方法是 ...

  7. 求1+2+3...+n 牛客网 剑指Offer

    求1+2+3...+n 牛客网 剑指Offer 题目描述 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). ...

  8. Vue&Element开发框架中增加工作流处理,工作流的各个管理页面的界面处理

    我在起前面的几篇随笔中,大概介绍了工作流的一些场景化处理,包括如何把具体业务表单组件化,并在查看和编辑界面中,动态加载组件内容,以及对于查看申请单的主页面,把审批.取消.发起会签.会签.批示分阅.阅办 ...

  9. 线程创建,属性设置与获得,等待线程结束,线程中fork,以及执行exec()

    这篇博客的形式我想以分析代码不同情况为主: 点击(此处)折叠或打开 #include<stdio.h> #include<pthread.h> #include<time ...

  10. django improperly configured

    ImproperlyConfigured: You must either define the environment variable DJANGO_SETTINGS_MODULE or call ...