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
Note:
- You may assume that the array does not change.
- There are many calls to sumRange function.
题目大意:给出一个不会改变的数组,求其区间和。
解题思路:第一眼看到这个题,我想到用树状数组来解。后来仔细一想,发现没有涉及到更新操作,用树状数组有点杀鸡用牛刀的感觉。然后发现可以维护一个前缀和,每次查询只需要两个前缀和相减即可。
代码如下:
typedef struct {
int *prefixSum;
int size;
} NumArray;
NumArray *numArrayCreate(int *nums, int numsSize) {
NumArray *obj = malloc(sizeof *obj);
obj->prefixSum = (int*)malloc(sizeof(int) * (numsSize + 1));
obj->size = numsSize;
obj->prefixSum[0] = nums[0];
for (int i = 1; i < numsSize; i++) {
obj->prefixSum[i] = nums[i] + obj->prefixSum[i - 1];
}
return obj;
}
int numArraySumRange(NumArray *obj, int i, int j) {
return obj->prefixSum[j] - obj->prefixSum[i - 1];
}
void numArrayFree(NumArray *obj) {
free(obj->prefixSum);
free(obj);
}
/**
* Your NumArray struct will be instantiated and called as such:
* struct NumArray* obj = numArrayCreate(nums, numsSize);
* int param_1 = numArraySumRange(obj, i, j);
* numArrayFree(obj);
*/