LeetCode 1476. 子矩形查询

2023-10-27

请你实现一个类 SubrectangleQueries ,它的构造函数的参数是一个 rows x cols 的矩形(这里用整数矩阵表示),并支持以下两种操作:
updateSubrectangle(int row1, int col1, int row2, int col2, int newValue)

用 newValue 更新以 (row1,col1) 为左上角且以 (row2,col2) 为右下角的子矩形。
getValue(int row, int col)

返回矩形中坐标 (row,col) 的当前值。

示例 1:

输入:
[“SubrectangleQueries”,“getValue”,“updateSubrectangle”,“getValue”,“getValue”,“updateSubrectangle”,“getValue”,“getValue”]
[[[[1,2,1],[4,3,4],[3,2,1],[1,1,1]]],[0,2],[0,0,3,2,5],[0,2],[3,1],[3,0,3,2,10],[3,1],[0,2]]
输出:
[null,1,null,5,5,null,10,5]
解释:
SubrectangleQueries subrectangleQueries = new SubrectangleQueries([[1,2,1],[4,3,4],[3,2,1],[1,1,1]]);
// 初始的 (4x3) 矩形如下:
// 1 2 1
// 4 3 4
// 3 2 1
// 1 1 1
subrectangleQueries.getValue(0, 2); // 返回 1
subrectangleQueries.updateSubrectangle(0, 0, 3, 2, 5);
// 此次更新后矩形变为:
// 5 5 5
// 5 5 5
// 5 5 5
// 5 5 5
subrectangleQueries.getValue(0, 2); // 返回 5
subrectangleQueries.getValue(3, 1); // 返回 5
subrectangleQueries.updateSubrectangle(3, 0, 3, 2, 10);
// 此次更新后矩形变为:
// 5 5 5
// 5 5 5
// 5 5 5
// 10 10 10
subrectangleQueries.getValue(3, 1); // 返回 10
subrectangleQueries.getValue(0, 2); // 返回 5

最多有 500 次updateSubrectangle 和 getValue 操作。
1 <= rows, cols <= 100
rows == rectangle.length
cols == rectangle[i].length
0 <= row1 <= row2 < rows
0 <= col1 <= col2 < cols
1 <= newValue, rectangle[i][j] <= 10^9
0 <= row < rows
0 <= col < cols

updateSubrectangle方法把操作存起来,getValue方法从后向前遍历所有操作,看是否操作到了这个值,如果操作到了,返回这个数变成了多少:

class SubrectangleQueries {
public:
    SubrectangleQueries(vector<vector<int>>& rectangle) : rectangle(rectangle) { }
    
    void updateSubrectangle(int row1, int col1, int row2, int col2, int newValue) {
        op.push_back({row1, row2, col1, col2, newValue});
    }
    
    int getValue(int row, int col) {
        int ans = 0;
        vector<vector<int>>::reverse_iterator re = op.rend();
        for (vector<vector<int>>::reverse_iterator rb = op.rbegin(); rb != re; ++rb) {
            if (row >= (*rb)[0] && row <= (*rb)[1] && col >= (*rb)[2] && col <= (*rb)[3]) {
                return (*rb)[4];
            }
        }

        return rectangle[row][col];
    }

private:
    vector<vector<int>> rectangle;

    vector<vector<int>> op;
};

/**
 * Your SubrectangleQueries object will be instantiated and called as such:
 * SubrectangleQueries* obj = new SubrectangleQueries(rectangle);
 * obj->updateSubrectangle(row1,col1,row2,col2,newValue);
 * int param_2 = obj->getValue(row,col);
 */

如果操作次数为n,getValue方法时间复杂度为O(n),空间复杂度为O(1),updateSubrectangle方法时间复杂度为O(1),空间复杂度为O(1)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LeetCode 1476. 子矩形查询 的相关文章

随机推荐

  • 基于Java的OA系统的设计与实现

    源码及论文下载 http www byamd xyz tag java 摘 要 学习和研究办公自动化中涉及到的知识和技术是实现办公自动化系统的前提条件 通过学习研究 掌握了其中的关键技术之后 结合自身的理解 对其做出了相应的表述 同时也成功
  • 【第03例】IPD体系进阶

    目录 前言 专栏目录 具体内容 IPD 相关专栏推荐 专栏列表 作者简介 前言 今天继续来讲讲 IPD 中涉及的几个评审点 ADCP 是英文 Av
  • 彻底理解coookie、session、token

    一 发展史 1 很久很久以前 web基本上就是文档的浏览而已 既然是浏览 作为服务器 不需要记录谁在某一段时间里都浏览了什么文档 每次请求都是一个新的HTTP协议 就是请求加响应 尤其是我不用记住是谁刚刚发了HTTP请求 每个请求对我来说都
  • Linux下的Oracle连接

    1 进入Oracle su oracle 2 开启监听器 oracle localhost root lsnrctl status oracle localhost root lsnrctl start oracle localhost r
  • 微信小程序自定义 tab-bar(基于 wepy)

    背景 微信小程序提供的原生 tab bar 功能简单 样式单一 无法满足业务需求 项目中使用的是 wepy 1 x 框架 实现原理与原生类似 方案 一 使用组件 在每个Tab页引入 修改全局配置 app wpy export default
  • CloudCompare--安装和简单的使用方法

    CloudCompare 安装和简单的使用方法 CloudCompare工具是一个非常好的处理点云数据的开源工具 有个不错的框架 很多公司对该工具进行二次开发以满足公司需要 第一次使用CloudCompare感觉非常好用 有兴趣的可以多了解
  • C语言进阶知识点(持续跟新)

    还是有点儿进阶的知识点 1 大段 小段内存模型 int val 0x12345678 int p1 val char p2 char p1 printf x n p2 p2 printf x n p2 short p3 val printf
  • windows server 2012 双网卡配置

    别用route 命令 在使用最新版的windows server 2012的时候 当存在两个或者多个网段的时候 就可以采用双网卡的方式来添加和配置路由 具体的设置方法如下 网段1 192 168 0 0 网段2 192 168 1 0 20
  • Go的 context 包的使用

    文章目录 背景 简介 主要方法 获得顶级上下文 当前协程上下文的操作 创建下级协程的Context 场景示例 背景 在父子协程协作过程中 父协程需要给子协程传递信息 子协程依据父协程传递的信息来决定自己的操作 这种需求下可以使用 conte
  • 337. House Robber III

    The thief has found himself a new place for his thievery again There is only one entrance to this area called the root B
  • 我们来浅谈代码语言的魅力

    01 浅谈 V8 Hidden Classes 和 Inline Caches Javascript 是动态的 基于属性链的语言 V8 是流行的 JavaScript 运行引擎 我们知道在运行时可以改变对象的属性和类型 为了定位对象的属性和
  • pb使用记录 关于pbt、pbr、pbd

    pb使用记录 关于pbl pbt pbr pbd 最近使用pb修改程序 遇到一些基础问题 之前有过了解但是几年没有碰过PB有些忘了 简单记录一下 1 关于pbl pbt pbr pbd pbt powerbuilder target 是8以
  • Java代码的静态编译和动态编译中的问题比较(1)

    Java 应用程序的性能经常成为开发社区中的讨论热点 因为该语言的设计初衷是使用解释的方式支持应用程序的可移植性目标 早期 Java 运行时所提供的性能级别远低于 C 和 C 之类的编译语言 尽管这些语言可以提供更高的性能 但是生成的代码只
  • 一篇文章带你了解JavaScript中的变量,作用域和内存问题

    作者 Jeskson 来源 达达前端小酒馆 1 在JavaScript中的变量分别区分为两种 一种为基本类型值 一种为引用类型值 基本类型值指的是简单的数据段 引用类型值为可能由多个值组成的对象 引用类型的值是保存在内存中的对象 JavaS
  • maven install的时候报Unable to find main class

    目录 问题描述 解决办法 解决方案一 添加一个主函数 解决方案二 将不是web工程的设置跳过 解决方案三 打包插件的作用本质上就是将当前项目所依赖的jar打包到一块 这样jar包就可以运行了 我们完全可以把parent的pom xml的bu
  • tauri使用github进行打包和自动更新教程

    之前的几篇文章介绍了tauri的基本安装 本地打包等方法 本文将接着就前几篇文章进行继续阐述 着重介绍tauri介绍tauri以github为后台服务进行打包 更新 以及tauri配置启动图 一 tauri使用github进行打包 1 首先
  • 学编程买什么电脑最好?

    补充下背景 在编程界 编程设备 电脑 有两个世界 一个是普通世界 这个世界里 程序员写代码的电脑和大众玩游戏看电影上网做ppt的电脑一样 就是你手头的普通电脑 什么电脑都行 另一个世界 是专业世界 是非windows行业的专业 高端 杨村白
  • C++ 学习(11)类和对象、封装、访问权限、成员属性私有性、构造函数与析构函数

    面向对象的特点 封装 继承 多态 万事万物皆为对象 对象上有其属性和行为 方法 1 封装 将属性与行为作为一个整体 表现生活中的事物 将属性和行为加以权限控制 public private等 C 封装 语法 class 类名 访问权限 属性
  • MBIST --- PATR1.Memorybist测试原理

    mem bist作为现在design设计中不可或缺的DFT设计内容 越发重要 本章节主要介绍mem bist组成部分 测试的原理以及注意事项 1 mem bist implementation 1 1 如下图所示为最basic的mbist
  • LeetCode 1476. 子矩形查询

    请你实现一个类 SubrectangleQueries 它的构造函数的参数是一个 rows x cols 的矩形 这里用整数矩阵表示 并支持以下两种操作 updateSubrectangle int row1 int col1 int ro