0
点赞
收藏
分享

微信扫一扫

数据结构与算法-IndexTree2D, 实现indexTree的二维数组形式


public class Code_IndexTree2D {
    private int[][] tree;
    private int[][] nums;
    private int N;
    private int M;

    public Code_IndexTree2D(int[][] matrix){
        if(matrix.length == 0 || matrix[0].length == 0){
            return ;
        }

        N = matrix.length;
        M = matrix[0].length;
        tree = new int[N+1][M+1]; // 第i行,第j列表示从 (1,1)位置到(i,j)形成的矩形的整体的和
        nums = new int[N][M];  // 保存上一次更新的值
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                update(i,j,matrix[i][j]);
            }
        }
    }

    public void update(int row, int col, int val){
        if(N == 0 || M == 0){
            return ;
        }
        int add = val - nums[row][col];
        nums[row][col] = val;
        for (int i = row+1; i <= N; i += (i & -i)) {
            for (int j = col+1; j <=M ; j += (j & -j)) {
                tree[i][j] += add;
            }
        }
    }

    private int sum(int row, int col){
        int ans = 0;
        for (int i = row+1; i > 0; i -= (i & -i)) {
            for (int j = col+1; j > 0; j -= (j & -j)) {
                        ans += tree[i][j];
            }
        }
        return ans;
    }

    // 求(row1,col1) 与 (row1,col2)形成的矩形的和
    public int sumRegion(int row1, int col1, int row2, int col2) {
        if (N == 0 || M == 0) {
            return 0;
        }
        return sum(row2, col2) + sum(row1 - 1, col1 - 1) - sum(row1 - 1, col2) - sum(row2, col1 - 1);
    }

    public static void main(String[] args) {
        int[][] matrix = {
                {1,2,3,4,5},
                {6,7,8,9,10},
                {11,12,13,14,15}
        };

        Code_IndexTree2D indexTree2D = new Code_IndexTree2D(matrix);
        for (int i = 0; i < indexTree2D.tree.length; i++) {
            for (int j = 0; j < indexTree2D.tree[0].length; j++) {
                System.out.print(indexTree2D.tree[i][j]+"  ");
            }
            System.out.println();
        }

        System.out.println(indexTree2D.sumRegion(0,0,2,2));
    }
}


举报

相关推荐

0 条评论