Leetcode304.二维区域和检索——动态规划之矩阵前缀和

2023-11-01

文章目录

引入

接上文Leetcode10.正则表达式匹配——动态规划之一个模型三个特征。在第17次双周赛的时候,我遇到这么一道题1314. 矩阵区域和

不过在此,我们先讨论该题的解法的经典题型

304.二维区域和检索 - 矩阵不可变
给定一个二维矩阵,计算其子矩形范围内元素的总和,该子矩阵的左上角为 (row1, col1) ,右下角为 (row2, col2)。
在这里插入图片描述
上图子矩阵左上角 (row1, col1) = (2, 1) ,右下角(row2, col2) = (4, 3),该子矩形内元素的总和为 8。
注:会多次调用区域求和方法。

拿到该题的时候,看到会多次调用区域求和方法时,就明白不能简单的每次计算区域每一行每一列的数值的和,必然是要保存其中间结果。

考虑到1310. 子数组异或查询,或者子数组求和的题目,我们一目了然,这道题应该用动态规划。

Leetcode题解

那么怎么去求动态规划方程呢?
首先,我们规定dp[i][j]表示区域(0,0)(i-1,j-1)的和,dp[1][1]就是(0,0)上点的值,dp[1][2]就是(0,0)加上(0,1)的值,以此类推。

为什么要这样规定呢?而不用dp[0][0]去表示(0,0)的值呢?
因为考虑到for循环是从0开始的,动态规划方程是根据前一个状态来计算的,所以,会导致数组越下界的情况发生。自然的,我们就想到初始化dp数组的时候,将其行列多增加1。

在规定了dp数组的定义后,就可以求解dp方程了。
在这里插入图片描述
我们要求解矩阵AD的和,我们手中的dp又是从O点开始计算的,我们唯一能拿到的只有OG、OE、OF、OD四个矩阵的值,自然的就可以得出:
A D = O D − O E − O F + O G AD=OD-OE-OF+OG AD=ODOEOF+OG
换成dp数组来表示,就是AD=dp[row2+1][col2+1]-dp[row2+1][col1]-dp[row1][col2+1]-dp[row1][col1]

结果表示出来了,但是dp数组怎么求还没说呢。
我们可以顺着刚才的思路,把求一个新的dp[i+1][j+1]看成这样:
矩阵AD就相当于新加入的点(i,j),没错就是把新加入的点看成一个矩阵,那么求解新的OD,就相当于:
O D = A D + O E + O F − O G OD=AD+OE+OF-OG OD=AD+OE+OFOG
换成dp数组来表示,dp[i+1][j+1]=matrix[i][j]+dp[i+1][j]+dp[i][j+1]-dp[i][j]

所以,我们的代码也就出来了:

class NumMatrix {
    int[][] dp;
    public NumMatrix(int[][] matrix) {
        if (matrix.length == 0 || matrix[0].length == 0) return;
        int row=matrix.length;
        int col=matrix[0].length;
        dp=new int[row+1][col+1];
        for(int i=0;i<row;i++){
            for(int j=0;j<col;j++){
                dp[i+1][j+1]=dp[i][j+1]+dp[i+1][j]+matrix[i][j]-dp[i][j];
            }
        }
    }
    
    public int sumRegion(int row1, int col1, int row2, int col2) {
        return dp[row2 + 1][col2 + 1] - dp[row1][col2 + 1] - dp[row2 + 1][col1] + dp[row1][col1];
    }
}

/**
 * Your NumMatrix object will be instantiated and called as such:
 * NumMatrix obj = new NumMatrix(matrix);
 * int param_1 = obj.sumRegion(row1,col1,row2,col2);
 */
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Leetcode304.二维区域和检索——动态规划之矩阵前缀和 的相关文章

随机推荐

  • 弱网压测环境 - tcconfig

    弱网压测环境 tcconfig 服务器性能指标 服务器接口的容错机制及重连机制需正常 服务器之间的网络通信需正常 服务器存储数据需一致及准确 请求不发生堆积 数据不发生错乱 弱网指标 带宽 吞吐量 单位时间内传输的数据量 单位通常是 每秒比
  • ROSE笔记-ctf.show_web2-WP

    ctf show web2 WP 直接是一个登录界面 在用户名处输入万能密码 admin or 1 1 显示了登陆信息 现在就是去找回显位置 用order by判断当前查询的列数 order by 4的时候登陆信息消失 而order by
  • 根据Modeller官网教程进行单模板建模

    Tutorial Basic Modeling https salilab org modeller tutorial basic html 1 搜索相关序列 从官网下载源文件 分析 TvLDH ali 存放目标序列 需满足要求的格式 gt
  • 异常处理函数set_exception_handler

    由于历史原因 php一开始被设计为一门面向过程的语言 所以异常处理没有使用像Java一样的 try catch 机制 出错时直接显示到页面上 或者记录到web服务器的错误日志中 并且php的错误分成了很多的级别 例如E ERROR E WA
  • 斐波那契数列(递归改进)

    题目 求斐波那契数列的第n项 写一个函数 输入n 求斐波那契数列的第n项 斐波那契数列的定义如下 大多数人看到后第一时间都会写出如下代码 递归 方法直观但时间效率低 long long Fibonacci unsigned int n if
  • 远程桌面连接不能复制粘贴怎么办 远程控制电脑无法复制粘贴的解决方法

    解决方法如下 第一步 打开远程桌面连接 点开电脑左下角的开始菜单 找到远程桌面连接 点开 如果你不常用远程桌面连接 那么这个图标就在附件里面 仔细找找就看到了 第二步 点开远程桌面连接的对话框 在对话框的左下角找到 显示选项 点开它 第三步
  • 数据加密标准(DES)概念及工作原理

    0x01 数据加密标准DES介绍 数据加密标准 Data Encryption Standard DES 是一种用于加密数字数据的对称密钥算法 密钥长度为56位 安全性不强 但它在密码学的进步中具有很大的影响力 0x02 数据加密标准历史
  • MySQL 锁

    文章目录 1 锁的种类 2 按兼容性划分 1 共享锁 2 排他锁 3 按锁粒度划分 1 表锁 2 行锁 3 注意 4 按锁模式划分 1 记录锁 2 间隙锁 3 临键锁 4 插入意向锁 5 意向锁 5 按加锁机制划分 1 悲观锁 2 乐观锁
  • 支付宝小程序集成mqtt兼容IOS和安卓

    1 前言 去年就想做支付宝小程序接入mqtt协议 但最终多方咨询 问客服问社区得到的答案都是支付宝小程序不能直接支持mqtt协议 偶然间发现徐宏大神的佳作 终于发现了xmqtt js这个好东西 它实现了支付宝小程序完美接入mqtt协议 设备
  • where、having、group by、order by、limit的区别和使用顺序

    where having group by order by limit的区别和使用顺序 姚文斌的博客 CSDN博客
  • 怎么让别人连接自己的数据库(MySQL)

    怎么让别人连接自己的数据库 MySQL update user set host where user root and host localhost flush privileges
  • 实现领域驱动设计----第一章

    带着问题上路 什么是领域驱动设计 是什么 为什么要做领域驱动设计 为什么要做 怎样做领域驱动设计 怎样做 其他的设计模式与领域驱动设计的区别 有类似为什么要做 但是是在取长补短的总结 译者序 就像在20世纪六七十年代出现了软件危机之后 面向
  • LINK : fatal error LNK1104: 无法打开文件“XXXXX.lib”解决方法

    1 首先我们一开始是配置包含的库目录 2 找到我们缺少XXXX lib对应的目录 确定 3 然后在链接器 输入 附加的依赖项中我们输入这个lib文件的全名 这一步按照实际情况添加 然后编译链接即可 主要原理分析 1 报错提示找不到这个lib
  • 玩转Mysql系列 - 第17篇:存储过程&自定义函数详解

    这是Mysql系列第17篇 环境 mysql5 7 25 cmd命令中进行演示 代码中被 包含的表示可选 符号分开的表示可选其一 需求背景介绍 线上程序有时候出现问题导致数据错误的时候 如果比较紧急 我们可以写一个存储来快速修复这块的数据
  • Ubuntu下的Nginx + Uwsgi + Django项目部署详细流程

    文章目录 前言 环境 工具 申请一个服务器 获取服务器实例 获取IP 配置安全组 配置放行端口 http www iszip com post 022714 html 连接服务器 配置用户 使用pyenv管理python版本 下载pyenv
  • sublime 搜索时忽略文件夹

    如上图 添加 folder exclude patterns 要忽略的文件夹 转载于 https www cnblogs com benchan2015 p 4949017 html
  • STM32------ADC实验

    目录 前言 一 库函数 1 ADC Init函数 2 ADC使能函数 3 ADC使能软件转换函数 4 ADC规则通道配置函数 5 ADC获取转换结果函数 6 实验目的 二 软件设计 1 adc c 2 adc h 前言 一 库函数 1 AD
  • react动态二级/三级路由操作

    一级路由就不写了 比较简单 下面是在一级页面mvvm中进行写入二级及三级路由页面 app js中进行路由配置
  • 【golang】巧用select {}阻塞main函数

    很多时候我们需要让main函数不退出 让它在后台一直执行 例如 func main for i 0 i lt 10 i 启动20个协程处理消息队列中的消息 c consumer New go c Start select 阻塞 可能大多数人
  • Leetcode304.二维区域和检索——动态规划之矩阵前缀和

    文章目录 引入 Leetcode题解 引入 接上文Leetcode10 正则表达式匹配 动态规划之一个模型三个特征 在第17次双周赛的时候 我遇到这么一道题1314 矩阵区域和 不过在此 我们先讨论该题的解法的经典题型 304 二维区域和检