小而美的算法技巧:前缀和数组

小而美的算法技巧:前缀和数组

类似动态规划。

class NumArray {private int[] preSum;public NumArray(int[] nums) {preSum=new int[nums.length+1];//preSum[0]的前缀和为0for(int i=1;i<preSum.length;i++){preSum[i]=nums[i-1]+preSum[i-1];//先计算累加和}}public int sumRange(int left, int right) {return preSum[right+1]-preSum[left];}
}

 前缀和矩阵的构建

我们用 preSum[i][j] 表示从矩阵的左上角 (0,0) 到位置 (i-1,j-1) 这个子矩阵的元素和。为了计算这个值,我们需要考虑以下几个部分的贡献:

  1. 上方的区域
  • 这是从矩阵的左上角 (0,0) 到位置 (i-2,j-1) 这个子矩阵的元素和,表示为 preSum[i-1][j]
  1. 左侧的区域
  • 这是从矩阵的左上角 (0,0) 到位置 (i-1,j-2) 这个子矩阵的元素和,表示为 preSum[i][j-1]
  1. 当前位置的元素
  • 这是当前矩阵位置的元素值,表示为 matrix[i-1][j-1]
  1. 重复计算的区域
  • 上述两个部分(上方和左侧)的交集部分,即从矩阵的左上角 (0,0) 到位置 (i-2,j-2) 这个子矩阵的元素和,被重复计算了一次,所以需要减去,表示为 preSum[i-1][j-1]

因此,结合上述四个部分的计算,我们得到:

preSum[i][j] = preSum[i - 1][j] + preSum[i][j - 1] + matrix[i - 1][j - 1] - preSum[i - 1][j - 1];

class NumMatrix {private int[][] preSum;public NumMatrix(int[][] matrix) {int m=matrix.length,n=matrix[0].length;//行列preSum=new int[m+1][n+1];//记录到i-1 j-1的值for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){preSum[i][j]=preSum[i-1][j]+preSum[i][j-1]+matrix[i-1][j-1]-preSum[i-1][j-1];}}}public int sumRegion(int row1, int col1, int row2, int col2) {return preSum[row2+1][col2+1]-preSum[row1][col2+1]-preSum[row2+1][col1]+preSum[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);*/

差分数组的主要适用场景是频繁对原始数组的某个区间的元素进行增减

小而美的算法技巧:差分数组

差分数组的主要适用场景是频繁对原始数组的某个区间的元素进行增减

 

class Solution {public int[] corpFlightBookings(int[][] bookings, int n) {int[] nums=new int[n];//差分方法,只用操作两次for(int[] booking:bookings){nums[booking[0]-1]+=booking[2];//索引从0开始所以-1if(booking[1]<n){nums[booking[1]]-=booking[2];}}for(int i=1;i<n;i++){nums[i]+=nums[i-1];}return nums;}
}

From和to是区间,

class Solution {public boolean carPooling(int[][] trips, int capacity) {int[] dif=new int[1001];for(int[] trip:trips){dif[trip[1]]+=trip[0];dif[trip[2]]-=trip[0];}int cur=0;for(int i=0;i<dif.length;i++){cur+=dif[i];if(cur>capacity) return false;}return true;}
}

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

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

相关文章

C++和Python相互调用(1)

Python的官方解释器CPython是用C语言编写&#xff0c;它提供了强大的C API&#xff0c;使得Python可以扩展和嵌入C和C代码。这种互操作性主要通过以下机制实现&#xff1a; Python/C API&#xff1a; Python解释器提供了一组C API&#xff0c;允许开发者编写C或C扩展模块。这…

解锁ChatGPT:从原理探索到GPT-2的中文实践及性能优化

⭐️我叫忆_恒心&#xff0c;一名喜欢书写博客的研究生&#x1f468;‍&#x1f393;。 如果觉得本文能帮到您&#xff0c;麻烦点个赞&#x1f44d;呗&#xff01; 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧&#xff0c;喜欢的小伙伴给个三连支…

视频生成模型 Dream Machine 开放试用;微软将停止 Copilot GPTs丨 RTE 开发者日报 Vol.224

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE&#xff08;Real-Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

MPLS工作过程

控制层面&#xff1a;路由协议工作&#xff0c;生成RIB-FIB&#xff0c;流量的方向即为控制流量&#xff1b; 数据层面&#xff1a;设备基于路由表访问目标&#xff0c;产生数据流量&#xff1b;与控制层面方向相反&#xff1b; 控制层面&#xff1a; 1) 在没有 MPLS 时控制层…

2.6数据报与虚电路

数据报 当作为通信子网用户的端系统要发送一个报文时&#xff0c;在端系统中实现的高层协议先把报文拆成若干个带有序号的数据单元&#xff0c;并在网络层加上地址等控制信息后形成数据报分组(即网络层PDU)中间结点存储分组一段很短的时间&#xff0c;找到最佳的路由后&#x…

TCP是什么、UDP是什么,它们有什么区别

目录 TCP 1.面向连接 2.可靠性 3.流量控制 4.拥塞控制 5.全双工通信 6.面向字节流 7.总结 UDP 1.无连接 2.不可靠 3.头部开销小 4.支持一对多、多对一和多对多通信 5.传输效率高 6.适合传输少量数据 7.总结 TCP和UDP的主要区别 1.连接性 2.可靠性 3.头部开…

6.nginx负载均衡

说明 增加服务器的数量,将请求分发到各个服务器上。 将原来请求集中到单个服务器上的情况改为将请求分发到多个服务器上。 案例 浏览器请求地址http://ip/edu/a.html, 负载均衡的效果,平分到8080和8081两台服务上中。 准备工作 tomcat8080配置 tomcat8081配置 直接通过…

Deepstream 应用——去掉矩形框和文字

问题 如何去掉矩形框&#xff1f;以及矩形框上文字&#xff1f; 思路 参照Deepstream用户手册——DeepStream应用及配置文件-CSDN博客 可以看到修改OSD组可以操控矩形框以及文字&#xff1b; 具体方法 若为配置文件将下列项内容修改如下所示&#xff1a; display-text0dis…

Java注解和反射——动态创建对象执行方法

创建类的对象&#xff1a;调用Class对象的newInstanc()方法 1. 类必须有一个无参构造器。 2. 类的构造器的访问权限需要足够。 没有无参构造器也可以创建对象。只要在操作的时候明确的调用类中的构造器&#xff0c;并将参数传递进去之后&#xff0c;才可以实例化操作。步骤如下…

【ARMv8/ARMv9 硬件加速系列 1 -- SVE | NEON | SIMD | VFP | MVE | MPE 基础介绍】

文章目录 ARM 扩展功能介绍VFP (Vector Floating Point)SIMD (Single Instruction, Multiple Data)NEONSVE (Scalable Vector Extension)SME (Scalable Matrix Extension)CME (Compute Matrix Engine)MVE (M-profile Vector Extension)MPE (Media Processing Engine)总结 ARM 扩…

嵌入式学习记录6.13(qt day1)

一.思维导图 二.练习&#xff08;简单模拟tim界面&#xff09; 2.1代码 mywidget.cpp #include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {this->setWindowTitle("Tim");this->setWindowIcon(QIcon("C:\\Users\\zy\…

语言中 函数用地址传参的好处

在C语言中&#xff0c;使用地址传参&#xff08;传递指针&#xff09;有以下几个好处&#xff1a; 1. **减少内存开销**&#xff1a; - 传递一个指针&#xff08;通常是一个地址&#xff09;比传递一个大的结构体或数组要高效得多&#xff0c;因为指针通常是一个固定大小&a…

微信小程序-uniapp-切换tab时数据列表如何切换?

如图&#xff1a; 这里有两个tab&#xff0c;要保证每次切换后列表保持不变&#xff0c;就必须在运行时要有两个持久化的数据源&#xff0c;每个tab是一个列表&#xff0c;让我们来设计一下这样的数据结构。 首先我们的数据结构是这样的&#xff1a; 体现在vue的data是这样的&a…

创建环境并安装包

创建环境 conda create --name py38 python3.8进入环境 conda activate py38退出环境 conda deactivate安装包 代码中如果有大量的包&#xff0c;换服务器时&#xff0c;就需要重新安装各种包&#xff0c;有没有方法可以自动识别代码中的包&#xff0c;然后一起安装 1.安装…

Qt多线程之moveToThread()函数

文章目录 一、moveToThread()执行后&#xff0c;当前代码线程没有改变。二、对象执行moveToThread()后&#xff0c;哪些成员加入了子线程1、创建对象时不指定父对象2、对属性对象使用moveToThread加入子线程作用域3、将属性对象的创建放到子线程中执行 三、C内存模型 在使用“继…

ollama系统更改模型存放位置

1.windows 设置完后可以在cmd中检查一下&#xff1a;echo %ollama_models% 2.linux 首先第一步&#xff1a;cd /etc/systemd/system/ 打开配置文件vim ollama.service 第二步&#xff1a;目录下的environment里面分号隔开添加OLLAMA_MODELS环境变量 第三步&#xff1a;source …

【Kadane】Leetcode 918. 环形子数组的最大和【中等】

环形子数组的最大和 给定一个长度为 n 的环形整数数组 nums &#xff0c;返回 nums 的非空 子数组 的最大可能和 。 环形数组 意味着数组的末端将会与开头相连呈环状。形式上&#xff0c; nums[i] 的下一个元素是 nums[(i 1) % n] &#xff0c;nums[i] 的前一个元素是 nums…

工作组局域网-ARP欺骗-攻击防御单双向

免责声明:本文仅做技术交流与学习... 目录 断网限制-单向 环境: 演示: win10: 欺骗前 欺骗后 kali: kali执行命令: win10结果: 劫持数据-双向 欺骗&#xff1a; 网络分析&#xff1a; 防御--动态解析改静态 中间人攻击 断网限制-单向 环境: 靶机:win10 攻击机:kali…

威胁情报多场景下的实战技术落地

传统的威胁情报狩猎存在覆盖率低、部署难、滞后性、效率低等多种问题&#xff0c;部分APT组织还会针对网络安全设备漏洞进行攻击。知道创宇APT威胁情报团队负责人代皓表示&#xff1a;除基础的测绘数据外&#xff0c;还可以通过定向测绘、主动测绘的手段&#xff0c;掌握多个资…

硬件电路基础

说起来在华北理工大学某个实验室当了快一年的硬件部部长&#xff0c;但是能力水平还是在单片机编程和应用层面&#xff08;虽然也很牛逼了&#xff0c;但是我不介意让我更牛逼一点&#xff09;。对于硬件电路的基础还不是很够。在b站偶尔刷到了我们学校隔壁电协一个学长的毕业视…