행렬이라는 2D 행렬이 있다고 가정하고 왼쪽 위 모서리와 오른쪽 아래 모서리에 의해 정의된 직사각형 내부 요소의 합을 계산해야 합니다.
따라서 입력이 다음과 같으면
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 |
따라서 합계를 찾고 값을 업데이트하는 메서드가 다음과 같이 호출됩니다.
합계 지역(2, 1, 4, 3)
업데이트(3, 2, 2)
합계 영역(2, 1, 4, 3) ,
위의 사각형(녹색)이 (2,1) 및 (4, 3)으로 정의되어 합계 =8을 포함하므로 출력은 8과 10이 됩니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
하나의 2D 배열 트리 정의
-
하나의 2D 배열 값 정의
-
행렬을 입력으로 받는 이니셜라이저 정의
-
n :=행렬의 행 크기
-
m :=(n이 0이 아닌 경우 0, 그렇지 않으면 행렬의 열 크기)
-
value :=n x m 크기의 2D 배열 하나 정의
-
tree :=차수의 2D 배열 하나 정의 (n + 1) x (m + 1)
-
i:=0 초기화의 경우, i − n일 때 업데이트(i를 1만큼 증가), −
-
j 초기화의 경우:=0, j
-
업데이트(i, j, 행렬[i, j])
-
-
-
update() 함수를 정의하면 row, col, val,
가 사용됩니다. -
n이 0과 같거나 m이 0과 같으면 -
-
반환
-
-
델타 :=val - 값[행, 열]
-
값[행, 열] :=발
-
i :=row + 1 초기화의 경우, i <=n일 때 i :=i + i &(-i)를 업데이트하면 −
를 수행합니다.-
j :=col + 1 초기화의 경우 j <=m일 때 j :=j + j &(-j) 업데이트, −
-
트리[i, j] :=트리[i, j] + 델타
-
-
-
함수 sum()을 정의하면 행, 열,
이 사용됩니다. -
ret :=0
-
초기화 i :=행의 경우 i> 0일 때 i :=i - i &(-i)를 업데이트하려면 −
를 수행합니다.-
j :=col 초기화의 경우 j> 0일 때 j :=j - j &(-j)를 업데이트하려면 −
를 수행합니다.-
ret :=ret + 트리[i, j]
-
-
-
리턴 렛
-
함수 sumRegion()을 정의하면 row1, col1, row2, col2,
가 사용됩니다. -
m이 0과 같거나 n이 0과 같으면 -
-
0 반환
-
-
(row2를 1씩 증가)
-
(row1을 1씩 증가)
-
(col1을 1씩 증가)
-
(col2를 1씩 증가)
-
return sum(row2, col2) + sum(row1 - 1, col1 - 1) - sum(row1 - 1, col2) - sum(row2, col1 - 1)
예시
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
#include네임스페이스 std;class NumMatrix {public:int n, m; 벡터<벡터 > 트리; 벡터<벡터 > 값; NumMatrix(벡터<벡터 > &matrix) { n =matrix.size(); m =!n ? 0 :행렬[0].크기(); 값 =벡터<벡터 >(n, 벡터 (m)); 트리 =벡터<벡터 >(n + 1, 벡터 (m + 1)); for (int i =0; i 0; i -=i &(-i)) { for (int j =col; j> 0; j -=j &(-j)) { ret +=tree[i ][제이]; } } 반환 ret; } int sumRegion(int row1, int col1, int row2, int col2) { if (m ==0 || n ==0) return 0; 행2++; 행1++; col1++; col2++; return sum(row2, col2) + sum(row1 - 1, col1 - 1) - sum(row1 - 1, col2) - sum(row2, col1 - 1); }};main() { 벡터<벡터 > v ={ {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}}; NumMatrix ob(v); cout <<(ob.sumRegion(2, 1, 4, 3)) < 입력
<전>벡터<벡터> v ={ {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}}; NumMatrix ob(v); cout <<(ob.sumRegion(2, 1, 4, 3)) < 출력
810