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);
}
}