zoukankan      html  css  js  c++  java
  • Range Sum Query 2D

    https://leetcode.com/problems/range-sum-query-2d-immutable/

    条件说sumRegion 会调很多次,如果每次都用双for 循环去累加的话就有太多重复计算了,所以可以实现cache 一下。

    可以有两种cache 机制,一种是在初始化的时候就生成cache 这样初始化时间比较长应该是O(n*m) 但是sumRegion 方法就方便和高效多了,大概是O(1)

    另一种是动态更新cache,随着sumRegion 的调用慢慢建立cache,这样处理起来会比较麻烦,但是初始化时间就可以忽略不计了,在sumRegion 的多次调用中慢慢的速度越来越快。

    我才用第一种方式,初始化时候建立cache,cache 同样是n*m 的矩阵,每个元素是当前行的累加和。

    调用sumRegion 的时候把每行的指定列范围内的和加起来就行了,而每行的和就用两个边际列的cache 值只差加上左边际列的原始值就行了,即:

    rowSum = cache[endCol] - cache[starCol] + origin[starCol]

    /**
     * @constructor
     * @param {number[][]} matrix
     */
    var NumMatrix = function(matrix) {
        if (matrix.length === 0) return;
        this.cache = [];
        this.matrix = matrix;
        this.row = matrix.length;
        this.col = matrix[0].length;
    
        for (var i = 0; i < this.row; i++) {
            var acc = 0;
            this.cache.push([]);
            for (var j = 0; j < this.col; j++) {
                acc += matrix[i][j];
                this.cache[i].push(acc);
            }
        }
        // console.log(this.cache);
    };
    
    /**
     * @param {number} row1
     * @param {number} col1
     * @param {number} row2
     * @param {number} col2
     * @return {number}
     */
    NumMatrix.prototype.sumRegion = function(row1, col1, row2, col2) {
        var sum = 0;
        if (!this.matrix) return 0;
        for (var i = row1; i <= row2; i++) {
            sum += this.cache[i][col2] - this.cache[i][col1] + this.matrix[i][col1];
        }
        return sum;
    };
  • 相关阅读:
    C++窗体应用程序
    C++继承方式简介及公有继承
    C++(继承的基本概念和语法)
    python(12)---科赫特雪花
    python(11)---pyinstaller
    20200914 day9 数据结构复习(一)
    20200914 day9 刷题记录
    20200913 day8模拟(二)
    20200912 day7 刷题记录
    20200912 day7 图论复习(一)
  • 原文地址:https://www.cnblogs.com/agentgamer/p/6237366.html
Copyright © 2011-2022 走看看