[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.reserve(nums.size());
 5         int sum = 0;
 6         for(int i: nums) {
 7             sum+=i;
 8             prefix_sum.push_back(sum);
 9         }
10     }
11
12     int sumRange(int i, int j) {
13         if(i == 0) return prefix_sum[j];
14         return prefix_sum[j]-prefix_sum[i-1];
15     }
16 private:
17     vector<int> prefix_sum;
18 };

那我们来看一下,若是方阵的情况怎么办?

2.二维区域和检索

解决方法一样,不同点在于如何求和和如何通过前缀和获得解。

二维的从(row1,col1)~(row2,col2)的求和情况应该是

dp[row2][col2]+dp[row1-1][col1-1]-dp[row2][col1-1]-dp[row1-1][col2]

这个需要我们的一点点初中数学的知识,加的dp[row1][col1-1]是被重复删去的区间,所以要加回来。

同样,要避开那些边界特殊情况,直接用if条件筛掉就行了,细节观察注释。

 1 class NumMatrix {
 2 private: vector<vector<int>>dp;
 3 public:
 4     NumMatrix(vector<vector<int>> matrix) {
 5         dp=matrix;
 6         int n=matrix.size();
 7         if(n>0){
 8             /*求和,先从左往右叠加*/
 9             int m=matrix[0].size();
10             for(int i=0;i<n;i++)
11                 for(int j=1;j<m;j++)
12                     dp[i][j]+=dp[i][j-1];
13             /*再从上往下叠加*/
14             for(int i=1;i<n;i++)
15                 for(int j=0;j<m;j++)
16                     dp[i][j]+=dp[i-1][j];
17         }
18
19     }
20
21     int sumRegion(int row1, int col1, int row2, int col2) {
22         /*最特殊的情况:row1=0,col1=0*/
23         if(row1==0&&col1==0)return dp[row2][col2];
24         /*特殊情况1:row1=0但col1!=0*/
25         if(row1==0){
26             return dp[row2][col2]-dp[row2][col1-1];
27         }
28         /*特殊情况2:row1!=0但col1=0*/
29         else if(col1==0){
30             return dp[row2][col2]-dp[row1-1][col2];
31         }
32         /*正常情况:row1不等于0同时colq也不等于0*/
33         else{
34             return dp[row2][col2]+dp[row1-1][col1-1]-dp[row2][col1-1]-dp[row1-1][col2];
35         }
36     }
37 };
38
39 /**
40  * Your NumMatrix object will be instantiated and called as such:
41  * NumMatrix obj = new NumMatrix(matrix);
42  * int param_1 = obj.sumRegion(row1,col1,row2,col2);
43  */

原文地址:https://www.cnblogs.com/adamwong/p/10216716.html

时间: 2024-11-09 06:14:44

[Leetcode]303.区域和检索的相关文章

LeetCode 307. 区域和检索 - 数组可修改

地址 https://leetcode-cn.com/problems/range-sum-query-mutable/ 题目描述给定一个整数数组  nums,求出数组从索引 i 到 j  (i ≤ j) 范围内元素的总和,包含 i,  j 两点. update(i, val) 函数可以通过将下标为 i 的数值更新为 val,从而对数列进行修改. 示例: Given nums = [1, 3, 5] sumRange(0, 2) -> 9 update(1, 2) sumRange(0, 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

307.区域与检索--数组可修改

区域与检索--数组可修改 线段树 参考 链接 代码 class NumArray { private ArrayList<Integer> sumSegmentTree; private int n; public NumArray(int[] nums) { n = nums.length; sumSegmentTree = new ArrayList<>(2 * n + 1); for (int i = 0; i < n; i++) { sumSegmentTree.ad

[LeetCode] Range Sum Query - Immutable 区域和检索

Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive. Example: Given nums = [-2, 0, 3, -5, 2, -1] sumRange(0, 2) -> 1 sumRange(2, 5) -> -1 sumRange(0, 5) -> -3 Note: You may assume that the array do

领扣(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

[Leetcode] 第307题 区域和检索-数组可修改

参考博客:(LeetCode 307) Range Sum Query - Mutable(Segment Tree) 一.题目描述 给定一个整数数组  nums,求出数组从索引 i 到 j  (i ≤ j) 范围内元素的总和,包含 i,  j 两点. update(i, val) 函数可以通过将下标为 i 的数值更新为 val,从而对数列进行修改. 示例: Given nums = [1, 3, 5] sumRange(0, 2) -> 9 update(1, 2) sumRange(0, 2

【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. Range Sum Query - Immutable | Dynamic Programming

303. Range Sum Query - Immutable Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive. Example: Given nums = [-2, 0, 3, -5, 2, -1] sumRange(0, 2) -> 1 sumRange(2, 5) -> -1 sumRange(0, 5) -> -3 Note:

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

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