[Leetcode]303.地区和检索&&304.二维地区和检索_玖富


玖富娱乐是一家为代理招商,直属主管信息发布为主的资讯网站,同时也兼顾玖富娱乐代理注册登录地址。

问题

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  */

 

-玖富娱乐是一家为代理招商,直属主管信息发布为主的资讯网站,同时也兼顾玖富娱乐代理注册登录地址。