接着刷。
题目:
1476. 子矩形查询
请你实现一个类 SubrectangleQueries ,它的构造函数的参数是一个 rows x cols 的矩形(这里用整数矩阵表示),并支持以下两种操作:
1. updateSubrectangle(int row1, int col1, int row2, int col2, int newValue)
用 newValue 更新以 (row1,col1) 为左上角且以 (row2,col2) 为右下角的子矩形。
2. getValue(int row, int col)
返回矩形中坐标 (row,col) 的当前值。
暴力解法:
code1
class SubrectangleQueries {
private:
vector<vector<int>> rec;
public:
SubrectangleQueries(vector<vector<int>>& rectangle) {
rec = rectangle;
}
void updateSubrectangle(int row1, int col1, int row2, int col2, int newValue) {
for(int i=row1; i<row2+1;i++){
for(int j=col1;j<col2+1;j++){
rec[i][j] = newValue;
}
}
}
int getValue(int row, int col) {
return rec[row][col];
}
};
/**
* Your SubrectangleQueries object will be instantiated and called as such:
* SubrectangleQueries* obj = new SubrectangleQueries(rectangle);
* obj->updateSubrectangle(row1,col1,row2,col2,newValue);
* int param_2 = obj->getValue(row,col);
*/
再采用一种不那么暴力的方法。就是记录修改,然后看倒着找,看查询的那个地方是否经历过修改,经历过就返回,没经历就接着倒着查,直到查完。
首先注意:
& 表示按位与操作。
&& 表示逻辑与的意思,即为and。
code2:
class SubrectangleQueries {
private:
vector<vector<int>> rec;
vector<vector<int>> record;
public:
SubrectangleQueries(vector<vector<int>>& rectangle) {
rec = rectangle;
}
void updateSubrectangle(int row1, int col1, int row2, int col2, int newValue) {
vector<int> temp={row1, col1, row2, col2, newValue};
record.push_back(temp);
}
int getValue(int row, int col) {
int n = record.size();
for(int i=n-1; i>=0; i--){
int r1 = record[i][0],
c1 = record[i][1],
r2 = record[i][2],
c2 = record[i][3],
num = record[i][4];
if(row>=r1&&row<=r2&&col>=c1&&col<=c2){
return num;
}
}
return rec[row][col];
}
};
/**
* Your SubrectangleQueries object will be instantiated and called as such:
* SubrectangleQueries* obj = new SubrectangleQueries(rectangle);
* obj->updateSubrectangle(row1,col1,row2,col2,newValue);
* int param_2 = obj->getValue(row,col);
*/
haole,就这样吧。