308 二維區域和檢索 可變

2021-10-10 17:27:54 字數 2034 閱讀 4888

題目描述:

給你乙個 2d 矩陣 matrix,請計算出從左上角 (row1, col1) 到右下角 (row2, col2) 組成的矩形中所有元素的和。

上述粉色矩形框內的,該矩形由左上角 (row1, col1) = (2, 1) 和右下角 (row2, col2) = (4, 3) 確定。其中,所包括的元素總和 sum = 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

update(3, 2, 2)

sumregion(2, 1, 4, 3) -> 10

注意:

矩陣 matrix 的值只能通過 update 函式來進行修改

你可以預設 update 函式和 sumregion 函式的呼叫次數是均勻分布的

你可以預設 row1 ≤ row2,col1 ≤ col2

方法1:

主要思路:

(1)和題目304 二維區域和檢索 - 矩陣不可變類似,只不過增加了更新原陣列元素值的操作;

(2)同樣使用積分影象的思路,只不過新增了儲存原始陣列元素的陣列,已實現對元素的更新操作;

class

nummatrix

int rows=matrix.

size()

;int cols=matrix[0]

.size()

; num_matrix=matrix;

//儲存陣列的元素

sum_matrix=vector

int>>

(rows+

1,vector<

int>

(cols+1,

0));

//積分影象,既儲存原陣列每個元素左上角所有元素的和

for(

int i=

1;i<=rows;

++i)}}

void

update

(int row,

int col,

int val)

int diff=val-num_matrix[row]

[col]

;//計算出當前元素原始值和要更新的值的差異

num_matrix[row]

[col]

=val;

//更新元素值

//更新積分影象中受影響的各個元素的值

for(

int i=row+

1;isize()

;++i)}}

intsumregion

(int row1,

int col1,

int row2,

int col2)

//直接返回給出的範圍內的元素和

return sum_matrix[row2+1]

[col2+1]

-sum_matrix[row2+1]

[col1]

-sum_matrix[row1]

[col2+1]

+sum_matrix[row1]

[col1];}

};/** * your nummatrix object will be instantiated and called as such:

* nummatrix* obj = new nummatrix(matrix);

* obj->update(row,col,val);

* int param_2 = obj->sumregion(row1,col1,row2,col2);

*/

304 二維區域和檢索 矩陣不可變

題目描述 給定乙個二維矩陣,計算其子矩形範圍內元素的總和,該子矩陣的左上角為 row1,col1 右下角為 row2,col2 30 1425 6321 1201 5410 1710 305 上圖子矩陣左上角 row1,col1 2,1 右下角 row2,col2 4,3 該子矩形內元素的總和為 8...

304 二維區域和檢索 矩陣不可變

給定乙個二維矩陣,計算其子矩形範圍內元素的總和,該子矩陣的左上角為 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...

304 二維區域和檢索 矩陣不可變

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...