题目:力扣-303
给定一个整数数组 nums,处理以下类型的多个查询:
计算索引 left 和 right (包含 left 和 right)之间的 nums 元素的 和 ,其中 left <= right,sumRange(int i, int j) 返回数组 nums 中索引 left 和 right 之间的元素的 总和 ,包含 left 和 right 两点(也就是 nums[left] + nums[left + 1] + ... + nums[right] )
解决思路:
方法一:暴力破解,累加left到right之间的元素,效率低
方法二:计算给定数组的前缀和,计算结果放入新数组array[i]里
cpp
方法二实现:
typedef struct {
int* preSum;
} NumArray;
// 初始化新数组
NumArray* numArrayCreate(int* nums, int numsSize) {
NumArray* array = (NumArray*)malloc(sizeof(NumArray));
array->preSum = (int*)malloc((numsSize + 1) * sizeof(int));
array->preSum[0] = 0;
for (int i = 0; i < numsSize; i++) {
array->preSum[i + 1] = nums[i] + array->preSum[i];
}
return array;
}
//主被调用函数
int numArraySumRange(NumArray* obj, int left, int right) {
return obj->preSum[right + 1] - obj->preSum[left];
}
// 释放内存
void numArrayFree(NumArray* obj) {
free(obj);
obj = NULL;
}
*/
时间复杂度: O(1)
空间复杂度: O(n),可以优化到O(1),在原数组里计算对应的前缀和来覆盖原数组的值。
执行用时:
19ms 击败79.57%
消耗内存:
15.16MB 击败56.45%