zoukankan      html  css  js  c++  java
  • 领扣(LeetCode)二维区域和检索 个人题解

    给定一个二维矩阵,计算其子矩形范围内元素的总和,该子矩阵的左上角为 (row1, col1) ,右下角为 (row2, col2)。

    Range Sum Query 2D
    上图子矩阵左上角 (row1, col1) = (2, 1) ,右下角(row2, col2) = (4, 3),该子矩形内元素的总和为 8。

    示例:

    给定 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
    

    说明:

    1. 你可以假设矩阵不可变。
    2. 会多次调用 sumRegion 方法
    3. 你可以假设 row1 ≤ row2 且 col1 ≤ col2。

    对于这一题,一开始拿到以为是很简单的,还想着为什么会放在中等题里面。

    虽然知道可能会出现超时的问题,但是第一次写还是尝试了暴力遍历求区域内值的和。答案虽然是正确的,当然显而易见报错了。超时。

    后来想到了(其实还是参考了思路,拜托欸,我可是萌新,哪里接触过这种空间换时间的神奇操作 XD),其实,每个区域块到左上角的值都可以简化为上一个已经处理过的区域块的加减乘除的取值,然后加上当前的值。同时,某个子区域的块也能转换成以上块的加减乘除集合。

    公式为:

    (略)

    代码如下:

    class NumMatrix {
        int[][] matrix;
        int[][] markmatr;
        
        
        public NumMatrix(int[][] matrix) {
            this.matrix=matrix;
            int x=matrix.length;
            int y=x>0?matrix[0].length:0;
            markmatr=new int[x+1][y+1];
            for(int i=1;i<=x;i++)
            {
                for(int j=1;j<=y;j++)
                {
                    markmatr[i][j]=markmatr[i-1][j]+markmatr[i][j-1]-markmatr[i-1][j-1]+matrix[i-1][j-1];
                }
            }
        }
    
        public int sumRegion(int row1, int col1, int row2, int col2) {
            int sum=0;
            sum=markmatr[row2+1][col2+1]-markmatr[row1][col2+1]-markmatr[row2+1][col1]+markmatr[row1][col1];
            return sum;
        }
    
    }
  • 相关阅读:
    MYSQL学习笔记
    javascript30--day01--Drum kit
    jQuery--dataTable 前端分页与后端分页 及遇到的问题
    hexo博客
    js—数组那些事儿
    累死青蛙系列——青蛙跳台阶问题
    js—求数组中的最大最小值
    前端html,css考点
    doxygen 使用 教程 不含安装仅设置
    fatal error LNK1169: one or more multiply defined symbols found 终极解决方案
  • 原文地址:https://www.cnblogs.com/axiangcoding/p/9886272.html
Copyright © 2011-2022 走看看