알고리즘
[leetcode] 304. Range Sum Query 2D - Immutable
JSYOvO
2021. 4. 8. 13:14
728x90
class NumMatrix {
public:
vector<vector<int>> dp;
NumMatrix(vector<vector<int>>& matrix) {
dp.assign(matrix.size(), vector<int>(matrix[0].size(), 0));
for(int i = 0; i<matrix.size(); i++){
for(int j = 0; j<matrix[0].size(); j++){
dp[i][j] = (i - 1 >= 0 ? dp[i - 1][j] : 0)
+ (j - 1 >= 0 ? dp[i][j - 1] : 0)
- ((i - 1 >= 0 && j - 1 >= 0) ? dp[i - 1][j - 1] : 0)
+ matrix[i][j];
}
}
}
int sumRegion(int row1, int col1, int row2, int col2) {
return dp[row2][col2]
- (row1 - 1 >= 0 ? dp[row1 - 1][col2] : 0)
- (col1 - 1 >= 0 ? dp[row2][col1 - 1] : 0)
+ ((row1 - 1 >= 0 && col1 - 1>= 0) ? dp[row1 - 1][col1 - 1] : 0);
}
};
아주 단순한 dp문제입니다.
2차원 배열에서 각 칸까지의 직사각형의 합을 저장해두고
나중에 결과출력할떄 써먹으면 됩니다.
이정도 실행속도면 거이 최적의 해로 보입니다.
시간복잡도 o(n)