LeetCode-304. Range Sum Query 2D - Immutable & 307. Range Sum Query - Mutable

303. Range Sum Query - Immutable

class NumArray {
    
    int[] accum;
    
    public NumArray(int[] nums) {
        accum=new int[nums.length+1];
        
        for(int i=1;i<=nums.length;i++)
            accum[i]=accum[i-1]+nums[i-1];
    }
    
    public int sumRange(int i, int j) {
        return accum[j+1]-accum[i];
    }
}

304. Range Sum Query 2D - Immutable
思路一致

class NumMatrix {

    int[][] sum;
    
    public NumMatrix(int[][] matrix) {
        if(matrix.length==0)
            return;
        sum=new int[matrix.length][matrix[0].length];
        for(int i=0;i<matrix.length;i++)
        {
            int curSum=0;
            for(int j=0;j<matrix[0].length;j++)
            {
                curSum+=matrix[i][j];
                sum[i][j]=(i-1>=0?sum[i-1][j]:0)+curSum;
            }
        }
    }
    
    public int sumRegion(int row1, int col1, int row2, int col2) {
        
        int intersect=(row1>=1 && col1>=1)?sum[row1-1][col1-1]:0;
        int leftDown=(col1>=1?sum[row2][col1-1]:0);
        int rightUp=(row1>=1?sum[row1-1][col2]:0);
        return sum[row2][col2]+intersect-rightUp-leftDown;
    }
}

307. Range Sum Query - Mutable
解法一:暴力法

class NumArray {

    public int[] arr;
    
    public NumArray(int[] nums) {
        this.arr=nums;
    }
    
    public void update(int i, int val) {
        arr[i]=val;
    }
    
    public int sumRange(int i, int j) {
        int ret=0;
        for(int idx=i;idx<=j;idx++)
            ret+=arr[idx];
        return ret;
    }
}

解法二:线段树

class NumArray {
    
    public int[] tree;
    public int n;

    public NumArray(int[] nums) {
        if (nums.length > 0) {
            n = nums.length;
            tree = new int[n * 2];
            buildTree(nums);
        }

    }

    private void buildTree(int[] nums) {
        for (int i = n, j = 0; i < 2 * n; i++, j++) {
            tree[i] = nums[j];
        }
        for (int i = n - 1; i > 0; i--) {
            tree[i] = tree[i * 2] + tree[i * 2 + 1];
        }
    }

    public void update(int pos, int val) {

        pos += n;
        tree[pos] = val;
        while (pos > 0) {
            int left = pos;
            int right = pos;
            if ((pos & 1) == 0)
                right = pos + 1;
            else
                left = pos - 1;
            tree[pos / 2] = tree[left] + tree[right];
            pos /= 2;
        }
    }

    public int sumRange(int i, int j) {

        i += n;
        j += n;
        int ret = 0;
        while (i <= j) {
            if ((i & 1) == 1) {
                ret += tree[i];
                i++;
            }
            if ((j & 1) == 0) {
                ret += tree[j];
                j--;
            }
            i /= 2;
            j /= 2;
        }
        return ret;
    }
}

解法三:索引二叉树

class NumArray {

    public int[] BIT;
    public int size;
    
    public NumArray(int[] nums) {
        size=nums.length;
        BIT=new int[size+1];
        for(int i=0;i<size;i++)
            update(i,nums[i]);
        
    }
    
    public void update(int i, int val) {
        i+=1;
        while(i<=size)
        {
            BIT[i]+=val;
            i+=i & (-i);
        }
    }
    
    private int getSum(int i)
    {
        int ret=0;
        i+=1;
        while(i>0){
            ret+=BIT[i];
            i-=i&(-i);
        }
        return ret;
    }
    
    public int sumRange(int i, int j) {
        return getSum(j)-getSum(i-1);
    }
}

猜你喜欢

转载自blog.csdn.net/To_be_to_thought/article/details/89819986
今日推荐