Leetcode303. 区域和检索 - 数组不可变(C语言)
算法-动态规划:算法与数据结构参考
题目:
给定一个整数数组 nums,求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和,包含 i, j 两点(可假设数组不可变。多次调用 sumRange 方法)。例:
输入:["NumArray","sumRange","sumRange","sumRange"]
[[[-2,0,3,-5,2,-1]],[0,2],[2,5],[0,5]]
输出:[null,1,-1,-3]
思路:
由于不会改变数组中元素,故可在每一个元素位置上存储开始位置到此位置的和,最后sunRange直接用间隔位置元素相减即可。
代码:
typedef struct {
int a;
int val[];
} NumArray;
NumArray* numArrayCreate(int* nums, int numsSize) {
NumArray* obj=(NumArray*)malloc(sizeof(NumArray)+(sizeof(int)*numsSize));
int sum=0;
for(int i=0;i<numsSize;i++){ //sum不断累加,在每一个位置赋一次值
sum=nums[i]+sum;
obj->val[i]=sum;
}
return obj;
}
int numArraySumRange(NumArray* obj, int i, int j) {
if(i==0) return obj->val[j];
else return obj->val[j]-obj->val[i-1];
}
void numArrayFree(NumArray* obj) {
free(obj);
}
/**
* Your NumArray struct will be instantiated and called as such:
* NumArray* obj = numArrayCreate(nums, numsSize);
* int param_1 = numArraySumRange(obj, i, j);
* numArrayFree(obj);
*/