借鉴了别人的答案,比我自己的巧妙的多。
/**
303. 区域和检索 - 数组不可变
给定一个整数数组 nums,求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和,包含 i, j 两点。
示例:
给定 nums = [-2, 0, 3, -5, 2, -1],求和函数为 sumRange()
sumRange(0, 2) -> 1
sumRange(2, 5) -> -1
sumRange(0, 5) -> -3
说明:
你可以假设数组不可变。
会多次调用 sumRange 方法。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/range-sum-query-immutable
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
*/
typedef int NumArray;
NumArray* numArrayCreate(int* nums, int numsSize) {
for(int i=1;i<numsSize;i++){
nums[i]+=nums[i-1];
}
return nums;
}
int numArraySumRange(NumArray* obj, int i, int j) {
return i==0?obj[j]:(obj[j]-obj[i]);
}
void numArrayFree(NumArray* obj) {
free(obj);
obj=NULL;
return;
}
//我自己的
#include <stdio.h>
typedef struct
{
int *nums;
int count;
} IntArray;
typedef struct
{
IntArray *intArray;
int size;
} NumArray;
void printNumArray(NumArray *numArray)
{
IntArray *obj=numArray->intArray;
int numArraySize=numArray->size;
for(int i=0; i<numArraySize; i++)
{
int *pointer=obj[i].nums;
int size=obj[i].count;
for(int i=0; i<size; i++)
{
printf("%d\t",pointer[i]);
}
printf("\n");
}
printf("\n");
}
NumArray* numArrayCreate(int* nums, int numsSize)
{
NumArray *numArray=malloc(sizeof(NumArray));
numArray->size=numsSize;
numArray->intArray=malloc(sizeof(IntArray)*numsSize);
for(int i=0; i<numsSize; i++)
{
int size=numsSize-i;
int *p=malloc(sizeof(int)*size);
p[0]=nums[i];
for(int j=1; j<size; j++)
{
p[j]=p[j-1]+nums[i+j];
}
numArray->intArray[i].count=size;
numArray->intArray[i].nums=p;
p=NULL;
}
return numArray;
}
int numArraySumRange(NumArray* obj, int i, int j)
{
return (obj->intArray+i)->nums[j-i];
}
void numArrayFree(NumArray* numArray)
{
IntArray *obj=numArray->intArray;
int numArraySize=numArray->size;
for(int i=0; i<numArraySize; i++)
{
free(obj[i].nums);
obj[i].nums=NULL;
}
free(obj);
obj=NULL;
}
int main()
{
int nums[6]= {-2, 0, 3, -5, 2, -1};
NumArray* obj = numArrayCreate(nums, 6);
printf("%d\n",numArraySumRange(obj, 2, 5));
numArrayFree(obj);
}