今天是三月二号,这个月力扣每日一题打卡第2天。两天来连续遇到前缀和解决一个区间内的和的问题,觉得还是比较高频的所以来记录一下这两道题目的思路和解法。
来一段狂神经典语录激励一下自己:

只要学不死,就往死里学!!

力扣第303题: 区域和检索-数组不可变

给定一个整数数组 nums,求出数组从索引 i 到 j(i ≤ j)范围内元素的总和,包含 i、j 两点。
实现 NumArray 类:

  • NumArray(int[] nums) 使用数组 nums 初始化对象
  • int sumRange(int i, int j) 返回数组 nums 从索引 i 到 j(i ≤ j)范围内元素的总和,包含 i、j 两点(也就是 sum(nums[i], nums[i + 1], … , nums[j]))
输入:
["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))

阅读题目可以得知,这道题目让我们求一个区间的和,求区间的和我们可以用preNum(前缀和)来求解。
preSum 方法能快速计算指定区间段 i - ji−j 的元素之和。它的计算方法是从左向右遍历数组,当遍历到数组的 ii 位置时,preSum 表示 ii 位置左边的元素之和。
假设数组长度为 NN,我们定义一个长度为 N+1N+1 的 preSum 数组,preSum[i] 表示该元素左边所有元素之和(不包含 i 元素)。然后遍历一次数组,累加区间 [0, i)[0,i) 范围内的元素,可以得到 preSum 数组。
代码实现:

class NumArray {//利用前缀和来求一个区间范围内的和private int[] preNum;public NumArray(int[] nums) {preNum = new int[nums.length+1];for(int i=0;i<nums.length;i++){preNum[i+1] = preNum[i] + nums[i];}}public int sumRange(int i, int j) {return preNum[j+1] - preNum[i];}
}/*** Your NumArray object will be instantiated and called as such:* NumArray obj = new NumArray(nums);* int param_1 = obj.sumRange(i,j);*/

力扣第304题: 二维区域和检索-矩阵不可变


示例:

给定 matrix = [[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]
]sumRegion(2, 1, 4, 3) -> 8
sumRegion(1, 1, 2, 2) -> 11
sumRegion(1, 2, 2, 4) -> 12

这道题是「303. 区域和检索 - 数组不可变」的进阶,第 303 题是在一维数组中做区域和检索,这道题是在二维矩阵中做区域和检索。
这道题有两种解法,分别是对每一行计算一维前缀和,以及对整个矩阵计算二维前缀和。
方法一:一维前缀和
第 303 题中,初始化时对数组计算前缀和,每次检索即可在 O(1) 的时间内得到结果。可以将第 303 题的做法应用于这道题,初始化时对矩阵的每一行计算前缀和,检索时对二维区域中的每一行计算子数组和,然后对每一行的子数组和计算总和。
具体实现方面,创建 m 行 n+1 列的二维数组,其中 m 和 n 分别是矩阵的行数和列数,preNum[i] 为matrix[i] 的前缀和数组。
代码实现:

class NumMatrix {//与一维的差不多,只是多了一个外层循环而已private int[][] preNum;public NumMatrix(int[][] matrix) {int m = matrix.length;//这里是一个坑,必须判断数组是否是大于0,否则的话会薄数组为空的异常,切记!if(m>0){int n = matrix[0].length;preNum = new int[m][n+1];for(int i=0;i<m;i++){for(int j=0;j<n;j++){preNum[i][j+1] = preNum[i][j] + matrix[i][j];}}}}public int sumRegion(int row1, int col1, int row2, int col2) {int sum = 0;for(int i=row1;i<=row2;i++){sum += preNum[i][col2+1]-preNum[i][col1];}return sum;}
}/*** Your NumMatrix object will be instantiated and called as such:* NumMatrix obj = new NumMatrix(matrix);* int param_1 = obj.sumRegion(row1,col1,row2,col2);*/

所有牛逼的人都有一段苦逼的岁月!但是你只要像SB一样去坚持,终将牛逼!

利用前缀和来求一个区间内的和相关推荐

  1. 求一个区间内所有的质数(C++实现)

    #include <iostream> #include <math.h> using namespace std;void main() {int i, j, k;for ( ...

  2. 组合数学-容斥原理-求指定区间内与n互素的数的个数

    求指定区间内与n互素的数的个数 给出整数n和r.求区间[1,r]中与n互素的数的个数. 去解决它的逆问题,求不与n互素的数的个数. 考虑n的所有素因子pi(i=1···k) 在[1,r]中有多少数能被 ...

  3. python输出所有素数_Python程序打印一个区间内所有质数

    Python程序打印一个区间内所有质数 在这个程序中,您将学习使用for循环打印一个区间内的所有质数并显示它. 要理解此示例,您应该了解以下Python编程主题: 一个大于1的正整数,除了1没有其他因 ...

  4. 洛谷 P1440 求m区间内的最小值

    题目描述 一个含有n项的数列(n<=2000000),求出每一项前的m个数到它这个区间内的最小值.若前面的数不足m项则从第1个数开始,若前面没有数则输出0. 输入输出格式 输入格式: 第一行两个 ...

  5. 输出一个区间内的质数(素数)

    质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数. #include<stdio.h> int main() {int m,n;int a=0;scanf(" ...

  6. [洛谷P1440]求m区间内的最小值

    题目大意:给你n个数,求出每个数前m位的最小值 题解:单调队列,用一个可以双向弹出的队列来存一串数,满足里面的数具有单调性,我们可以假设它是单调递增的,即求最小的数.那么可以把要插入的这个数与队尾元素 ...

  7. c语言筛法求一个范围内的素数,运用埃拉托色尼筛法求解一定范围内的素数.docx...

    #includetypedef struct Node{ int data; struct Node *link; }LinkList; void buildList(int max,LinkList ...

  8. (hdu 简单题 128道)平方和与立方和(求一个区间的立方和和平方和)

    题目: 平方和与立方和 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota ...

  9. qt求一个区间的随机数

    举例说明: 求65-90之间的随机数 qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); quint8 ch = (quint8)qrand()%25 ...

最新文章

  1. Spring MVC-表单(Form)标签-单选按钮集合(RadioButtons)示例(转载实践)
  2. WebClient 请求 https 页面出错:未能创建 SSL/TLS 安全通道
  3. 双显卡能双屏显示吗_i5-8305G+双显卡交火,最近很火的迷你主机零刻Turbo性能靠谱吗?...
  4. Java编程在线学习靠谱吗?能学会吗?
  5. python 检查文件是否存在_Python中如何判断文件是否存在?
  6. oracle 01013 02063,Oracle11g dblink用户密码大写限制-ORA-02063: preceding line from FOR244_DBLINK...
  7. python爬取内容乱码_python爬取html中文乱码
  8. PHP23 AJAX分页
  9. 用Dell光盘安装系统
  10. 【ActiveMQ】ActiveMQ在CentOS的搭建与使用
  11. 修改tomcat日志打印位置
  12. iOS开发监测手机流量使用情况
  13. android tensorflow文字识别身份证识别ocr文字识别商用源码
  14. windows7计算机不显示光驱,Windows7系统下找不到光驱怎么办呢?
  15. GitLab: API is not accessible的错误解决
  16. 使用 github pages, 部署静态网页
  17. 系分 - 数学与经济管理
  18. 基于高光谱图像分类的分析研究
  19. 应用程序开发——电子地图管理系统
  20. 第二章:基本电气控制电路

热门文章

  1. linux启动Oracle和mysql
  2. 我的画作(在photoshop里面画的)
  3. 什么是死锁,简述死锁发生的四个必要条件,如何避免与预防死锁
  4. 深度理解GCD线程死锁,队列,同步和异步,串行和并发
  5. 渠道数字化有什么好处?如何实现渠道数字化营销?
  6. 学习控制发光二极管代码心得
  7. 图像语义分割实践(一)标签制作与转换
  8. 【Java基础】第6章_面向对象(下)-1:static关键字、main方法、代码块、final关键字
  9. VirtualBox导入ova文件报错E_INVALIDARG (0x80070057)
  10. android 无sdk usb/蓝牙 连接热敏打印机外卖小票打印