303. Range Sum Query - Immutable
Easy
Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive.
Example:
Given nums = [-2, 0, 3, -5, 2, -1]
sumRange(0, 2) -> 1
sumRange(2, 5) -> -1
sumRange(0, 5) -> -3
题意
区间求和
思路
线段树,查询、更新复杂度都是O(nlogn). 这题由于数组是不变的不需要更新,所以有更快的O(1)的查询方式:cache前缀和。但是还是用线段树做了,权当是复习一下线段树吧。
代码
class NumArray {
private int n;
private int[] tree;
private void buildTree(int root, int l, int r, int[] nums) {
if (l == r) {
tree[root] = nums[l];
return;
}
int m = (l + r) / 2;
buildTree(2*root+1, l, m, nums);
buildTree(2*root+2, m+1, r, nums);
tree[root] = tree[2*root+1] + tree[2*root+2];
}
private int queryRange(int root, int tl, int tr, int ql, int qr) {
if (tl >= ql && tr <= qr) {
return tree[root];
}
if (tl > qr || tr < ql) {
return 0;
}
int tm = (tl + tr) / 2;
return queryRange(2*root+1, tl, tm, ql, qr) + queryRange(2*root+2, tm+1, tr, ql, qr);
}
public NumArray(int[] nums) {
n = nums.length;
if (n != 0) {
tree = new int[n * 4];
buildTree(0, 0, n - 1, nums);
}
}
public int sumRange(int i, int j) {
if (n == 0) {
return 0;
}
return queryRange(0, 0, n-1, i, j);
}
}
/**
* Your NumArray object will be instantiated and called as such:
* NumArray obj = new NumArray(nums);
* int param_1 = obj.sumRange(i,j);
*/