对二维区域和检索 - 矩阵不可变 超时的改进



暴力法:private int[][] data;

public NumMatrix(int[][] matrix) {
    data = matrix;
}

public int sumRegion(int row1, int col1, int row2, int col2) {
    int sum = 0;
    for (int r = row1; r <= row2; r++) {
        for (int c = col1; c <= col2; c++) {
            sum += data[r][c];
        }
    }
    return sum;
}

动规:class NumMatrix {

    private int[][] dp;

    public NumMatrix(int[][] matrix) {
        if (matrix.length == 0 || matrix[0].length == 0) return;
        dp = new int[matrix.length][matrix[0].length + 1];

        for (int r = 0; r < matrix.length; r++) {
            for (int c = 0; c < matrix[0].length; c++) {
                dp[r][c + 1] = dp[r][c] + matrix[r][c];
            }
        }
    }
    将计算的过程分为两部分:
    public int sumRegion(int row1, int col1, int row2, int col2) {
        int sum = 0;
        for (int row = row1; row <= row2; row++) {
            sum += dp[row][col2 + 1] - dp[row][col1];
        }
        return sum;
    }
}

原文地址:https://www.cnblogs.com/z2529827226/p/11743047.html

时间: 2024-11-09 06:21:08

对二维区域和检索 - 矩阵不可变 超时的改进的相关文章

304. 二维区域和检索 - 矩阵不可变(动态规划)

给定一个二维矩阵,计算其子矩形范围内元素的总和,该子矩阵的左上角为 (row1, col1) ,右下角为 (row2, col2). 来自leetcode 本题既是一个熟悉class的题目,也是一道简单的动态规划题,子矩阵面积 = 两块面积 - 重复面积 + 右下角面积 收获: 都是一些值得学习的小习惯 1. 特判的时候直接return, 我会经常思考要不要 return 0 def __init__(self,matrix): if not matrix: return 2.动态规划方程,求子

[LeetCode] Range Sum Query 2D - Mutable 二维区域和检索 - 可变

Given a 2D matrix matrix, find the sum of the elements inside the rectangle defined by its upper left corner (row1, col1) and lower right corner (row2, col2). The above rectangle (with the red border) is defined by (row1, col1) = (2, 1) and (row2, co

领扣(LeetCode)二维区域和检索 个人题解

给定一个二维矩阵,计算其子矩形范围内元素的总和,该子矩阵的左上角为 (row1, col1) ,右下角为 (row2, col2). 上图子矩阵左上角 (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] ] sumRegi

poj 1195:Mobile phones(二维线段树,矩阵求和,经典题)

Mobile phones Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 14391   Accepted: 6685 Description Suppose that the fourth generation mobile phone base stations in the Tampere area operate as follows. The area is divided into squares. The

任意定义一个二维数组,实现矩阵的转置——java

import java.util.Scanner; /* * 任意定义一个二维数组,编写程序实现矩阵的转置. * */ public class MatrixTransposition { public static void main(String[] args) { //create the rowNumber and columnNumber of the matrix Scanner input = new Scanner(System.in); System.out.println("

3月31号周二课堂练习:结对开发----求二维数组组成的矩阵中子矩阵的最大值二

一.题目要求 1.1输入一个二维整形数组,数组里有正数也有负数. 1.2二维数组首尾相接,象个一条首尾相接带子一样. 1.3数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 1.4求所有子数组的和的最大值.要求时间复杂度为O(n). 二.结对要求 2.1两人结对完成编程任务. 2.2一人主要负责程序分析,代码编程. 2.3一人负责代码复审和代码测试计划. 2.4发表一篇博客文章讲述两人合作中的过程.体会以及如何解决冲突(附结对开发的工作照). 三.设计过程 上次已经算过二维数组中

二维数组求最大矩阵

一.项目思路:利用的穷举法,也可以是压榨法,就是把这个矩阵压缩成一个长方形,宽为一,然后在向其他列扩展,之和加起来在比较. 此次是团队开发,我负责编辑程序. 二.项目代码: #include"iostream.h" using namespace std; static  int  max; void qiongju(int juzhen[][4],int ai,int aj,int m,int n) {      int linshi;      for(int i=ai;i<

【leetcode 简单】 第七十九题 区域和检索 - 数组不可变

给定一个整数数组  nums,求出数组从索引 i 到 j  (i ≤ j) 范围内元素的总和,包含 i,  j 两点. 示例: 给定 nums = [-2, 0, 3, -5, 2, -1],求和函数为 sumRange() sumRange(0, 2) -> 1 sumRange(2, 5) -> -1 sumRange(0, 5) -> -3 说明: 你可以假设数组不可变. 会多次调用 sumRange 方法. class NumArray: def __init__(self, n

[Leetcode]303.区域和检索

题目 1.区域和检索: 简单题,前缀和方法 乍一看就觉得应该用前缀和来做,一个数组多次查询. 实现方法: 新建一个private数组prefix_sum[i],用来存储nums前i个数组的和, 需要找区间和的时候直接通过prefix_sum[j]-prefix[i-1]即可得到从[i,j]区间的和,当i是0的时候需要特殊处理以防数组越界. 1 class NumArray { 2 public: 3 NumArray(vector<int> nums) { 4 prefix_sum.reser