LeetCode-Java:303、304区域检索(前缀和)

文章目录

    • 题目
      • 303、区域和检索(数组不可变)
      • 304、二维区域和检索(矩阵不可变)
      • ①303,一维前缀和
      • ②304,二维前缀和
    • 算法
      • 前缀和
        • 一维前缀和
        • 二维前缀和

题目

303、区域和检索(数组不可变)

给定一个整数数组 nums,处理以下类型的多个查询:

  1. 计算索引 leftright (包含 leftright)之间的 nums 元素的 ,其中 left <= right

实现 NumArray 类:

  • NumArray(int[] nums) 使用数组 nums 初始化对象
  • int sumRange(int i, int j) 返回数组 nums 中索引 leftright 之间的元素的 总和 ,包含 leftright 两点(也就是 nums[left] + nums[left + 1] + ... + nums[right] )

示例 1:

输入:
["NumArray", "sumRange", "sumRange", "sumRange"]
[[[-2, 0, 3, -5, 2, -1]], [0, 2], [2, 5], [0, 5]]
输出:
[null, 1, -1, -3]解释:
NumArray numArray = new NumArray([-2, 0, 3, -5, 2, -1]);
numArray.sumRange(0, 2); // return 1 ((-2) + 0 + 3)
numArray.sumRange(2, 5); // return -1 (3 + (-5) + 2 + (-1)) 
numArray.sumRange(0, 5); // return -3 ((-2) + 0 + 3 + (-5) + 2 + (-1))

304、二维区域和检索(矩阵不可变)

给定一个二维矩阵 matrix,以下类型的多个请求:

  • 计算其子矩形范围内元素的总和,该子矩阵的 左上角(row1, col1)右下角(row2, col2)

实现 NumMatrix 类:

  • NumMatrix(int[][] matrix) 给定整数矩阵 matrix 进行初始化
  • int sumRegion(int row1, int col1, int row2, int col2) 返回 左上角 (row1, col1)右下角 (row2, col2) 所描述的子矩阵的元素 总和

示例 1:

在这里插入图片描述

输入: 
["NumMatrix","sumRegion","sumRegion","sumRegion"]
[[[[3,0,1,4,2],[5,6,3,2,1],[1,2,0,1,5],[4,1,0,1,7],[1,0,3,0,5]]],[2,1,4,3],[1,1,2,2],[1,2,2,4]]
输出: 
[null, 8, 11, 12]解释:
NumMatrix numMatrix = new NumMatrix([[3,0,1,4,2],[5,6,3,2,1],[1,2,0,1,5],[4,1,0,1,7],[1,0,3,0,5]]);
numMatrix.sumRegion(2, 1, 4, 3); // return 8 (红色矩形框的元素总和)
numMatrix.sumRegion(1, 1, 2, 2); // return 11 (绿色矩形框的元素总和)
numMatrix.sumRegion(1, 2, 2, 4); // return 12 (蓝色矩形框的元素总和)

①303,一维前缀和

class Solution {public int[] productExceptSelf(int[] nums) {int len=nums.length;int[] answer=new int[len];answer[0]=1;for(int i=1;i<len;i++){answer[i]=nums[i-1]*answer[i-1];}int R=nums[len-1]; // R存储右侧所有元素乘积for (int i = len - 2; i >= 0; i--) {answer[i] = answer[i] * R;R=R*nums[i];}return answer;}
}

②304,二维前缀和

class NumMatrix {int[][] sum;public NumMatrix(int[][] matrix) {int m=matrix.length,n=matrix[0].length;sum=new int[m+1][n+1];for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+matrix[i-1][j-1];}}}public int sumRegion(int row1, int col1, int row2, int col2) {return sum[row2+1][col2+1]-sum[row1][col2+1]-sum[row2+1][col1]+sum[row1][col1];}
}

算法

前缀和

前缀和是一种常见的算法技巧,用于快速计算数组中某个区间内元素的和,通常用于优化处理大量的区间求和问题,比如给定一个数组,询问其中某个连续区间内元素的和。

算法原理: 前缀和的核心思想是通过对数组进行预处理,计算出从数组开头到每个位置的元素累加和,然后利用这些预先计算好的累加和,在O(1)时间内求出任意区间的和。假设给定数组为A,其前缀和数组为prefix,其中prefix[i]表示数组A从0到i的元素和。

一维前缀和

假设给定数组为A = [1, 2, 3, 4, 5],其前缀和数组为prefix = [1, 3, 6, 10, 15]。

但在①②中,A数组的前缀和应当为prefix = [0,1, 3, 6, 10, 15],比原数组要多一个。

在计算任意区间的和时,通过在前缀和数组中添加0,可以统一处理起始位置为0的边界情况,无需单独考虑。例如,对于查询区间[0, 3],直接使用prefix[3]即可得到结果,无需特殊处理。

具体使用的时候建议用草稿纸绘制相关的数组或者矩阵的图形,进行检验。

二维前缀和

二维的前缀和更为复杂,

A = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]

prefix = [ [1, 3, 6], [5, 12, 21], [12, 27, 45] ]

prefix[i] [j] = A[i] [j] + prefix[i-1] [j] + prefix[i] [j-1] - prefix[i-1] [j-1]

可以用下图帮助理解(图源LeetCode:负雪明烛):

至于输出的公式,也类似于上面的用右下角位置加上左上角-1的位置减去区域右上角和左下角:

area=sum[row2+1] [col2+1]-sum[row1] [col2+1]-sum[row2+1] [col1]+sum[row1] [col1](为了方便书写代码,实际矩阵比原矩阵大一圈,所以这里所有的加减都在原矩阵基础上+1)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/306876.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

宝塔面板部署腾讯云的域名

一、腾讯云&#xff0c;搜索我的证书&#xff0c;点击打开如图所示&#xff0c;点击下砸 二、点击宝塔的证书&#xff0c;然后下载到桌面 三、解压 四、打开宝塔&#xff0c;网站》自己的项目列表中要绑定的ssl 五、对应的文件内容复制进去&#xff0c;保存并启用证书 六、有了…

基于小程序实现的医院预约挂号系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;spring…

微信小程序 超市网上购物商城采购管理系统

本课题研究的是基于HBuilder X系统平台的超市网上商城进货管理系统&#xff0c;开发这款超市网上商城进货管理系统主要是为了帮助用户可以不用约束时间与地点进行所需信息。本文详细讲述了超市网上商城进货管理系统的界面设计及使用&#xff0c;主要包括界面的实现、控件的使用…

【日常记录】【JS】使用Number.prototype.toLocaleString 对 数字做 格式化

文章目录 1、引言2、语法参数3、常见案例4、参考链接 1、引言 在目前的项目中&#xff0c;经常需要给数字做格式化处理&#xff0c;特别是财务方面&#xff0c;比如分割成千分位&#xff0c;保留小数&#xff0c;增加符号等 &#xff0c;这些都需要我们手写一些函数来处理。 但…

解决cmd输入py文件路径不能执行,使用anaconda prompt 能执行

究其原因&#xff0c;是因为没有配置环境&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 第一步&#xff1a;配置环境变量 操作步骤如下&#xff1a; 1、右击此电脑 ---->属性 2、高级系统设置 3、点击环境变量 4、选择 …

ELK企业级日志分析系统(elasticsearch+logstash+kibana)

目录 一.ELK概述 1.定义 &#xff08;1&#xff09;ElasticSearch &#xff08;2&#xff09;Kiabana &#xff08;3&#xff09;Logstash &#xff08;4&#xff09;Filebeat 2.filebeat结合logstash带来好处 3.为什么要是用ELK&#xff1f; 4.完整日志系统基本特征 …

gitlab 搭建

cat etc/initial_root_password Password: ipGg5y7GJPp/YmVHf3c3ViMKzCWYJSjU4JzUktrw8cY ###### 可修改&#xff0c;可不修改&#xff0c;并###并#并 #初始密码 #本次未修改 vim /data/gitlab/etc/gitlab.rb external_url http://ip/gitlab #访问网址及端口 #ssh远程地址 gi…

算法打卡day34

今日任务&#xff1a; 1&#xff09;62.不同路径 2&#xff09;63.不同路径 II 3&#xff09;复习day10 62.不同路径 题目链接&#xff1a;62. 不同路径 - 力扣&#xff08;LeetCode&#xff09; 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “S…

算法修炼之路之双指针含多道leetcode 经典题目

目录 前言 一&#xff1a;普通双指针 1.经典题目一 283移动0问题 分析 代码实现 2.经典题目二 1089复写0 分析 代码实现 二&#xff1a;解决成环类问题-快慢指针 经典例题一 202快乐数 分析 代码实现 三&#xff1a;左右相遇指针 经典例题一 11 盛最多水的容…

AR远程空间标注Vuforia+WebRTC音视频通话和空间标注功能

AR远程空间标注VuforiaWebRTC音视频通话和空间标注功能 视频学习地址&#xff1a;https://www.bilibili.com/video/BV1ZT4y187mG/?vd_sourcefc4b6cdd80b58c93a280fd74c37aadbf

GPT建模与预测实战

代码链接见文末 效果图&#xff1a; 1.数据样本生成方法 训练配置参数&#xff1a; --epochs 40 --batch_size 8 --device 0 --train_path data/train.pkl 其中train.pkl是处理后的文件 因此&#xff0c;我们首先需要执行preprocess.py进行预处理操作&#xff0c;配置参数…

分布式锁-redission锁的MutiLock原理

5.5 分布式锁-redission锁的MutiLock原理 为了提高redis的可用性&#xff0c;我们会搭建集群或者主从&#xff0c;现在以主从为例 此时我们去写命令&#xff0c;写在主机上&#xff0c; 主机会将数据同步给从机&#xff0c;但是假设在主机还没有来得及把数据写入到从机去的时…

【Android surface 】二:源码分析App的surface创建过程

文章目录 画布surfaceViewRoot的创建&setView分析setViewrequestLayoutViewRoot和WMS的关系 activity的UI绘制draw surfacejni层分析Surface无参构造SurfaceSessionSurfaceSession_init surface的有参构造Surface_copyFromSurface_writeToParcelSurface_readFromParcel 总结…

文心一言

文章目录 前言一、首页二、使用总结 前言 今天给大家带来百度的文心一言,它基于百度的文心大模型,是一种全新的生成式人工智能工具。 一、首页 首先要登录才能使用,左侧可以看到以前的聊天历史 3.5的目前免费用,但是4.0的就需要vip了 二、使用 首先在最下方文本框输入你想要搜…

Harmony鸿蒙南向驱动开发-SDIO接口使用

功能简介 SDIO是安全数字输入输出接口&#xff08;Secure Digital Input and Output&#xff09;的缩写&#xff0c;是从SD内存卡接口的基础上演化出来的一种外设接口。SDIO接口兼容以前的SD卡&#xff0c;并且可以连接支持SDIO接口的其他设备。 SDIO接口定义了操作SDIO的通用…

总分410+专业130+国防科技大学831信号与系统考研经验国防科大电子信息与通信工程,真题,大纲,参考书。

好几个学弟催着&#xff0c;总结一下我自己的复习经历&#xff0c;希望大家复习少走弯路&#xff0c;投入的复习正比换回分数。我专业课831信号与系统130&#xff08;感觉比估分要低&#xff0c;后面找Jenny老师讨论了自己拿不准的地方也没有错误&#xff0c;心里最近也这经常回…

记账本|基于SSM的家庭记账本小程序设计与实现(源码+数据库+文档)

家庭记账本小程序目录 基于SSM的家庭记账本小程序设计与实现 一、前言 二、系统设计 三、系统功能设计 1、小程序端&#xff1a; 2、后台 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大…

【opencv】示例-imagelist_creator.cpp 从命令行参数中创建一个图像文件列表(yaml格式)...

/* 这个程序可以创建一个命令行参数列表的yaml或xml文件列表 */ // 包含必要的OpenCV头文件 #include "opencv2/core.hpp" #include "opencv2/imgcodecs.hpp" #include "opencv2/highgui.hpp" #include <string> #include <iostream>…

视频秒播优化实践

本文字数&#xff1a;2259字 预计阅读时间&#xff1a;10分钟 视频起播时间&#xff0c;即首帧时间&#xff0c;是视频类应用的一个重要核心指标&#xff0c;也是影响用户观看体验的核心因素之一。如果视频要加载很久才能开始播放&#xff0c;用户放弃播放甚至离开 App 的概率都…

飞书api增加权限

1&#xff0c;进入飞书开发者后台&#xff1a;飞书开放平台 给应用增加权限 2&#xff0c;进入飞书管理后台 https://fw5slkpbyb3.feishu.cn/admin/appCenter/audit 审核最新发布的版本 如果还是不行&#xff0c;则需要修改数据权限&#xff0c;修改为全部成员可修改。 改完…