力扣【303-区域检索】【数组-C语言】

题目:力扣-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%

相关推荐
XH华2 分钟前
初识C语言之二维数组(下)
c语言·算法
南宫生24 分钟前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
sanguine__40 分钟前
Web APIs学习 (操作DOM BOM)
学习
Lenyiin1 小时前
第146场双周赛:统计符合条件长度为3的子数组数目、统计异或值为给定值的路径数目、判断网格图能否被切割成块、唯一中间众数子序列 Ⅰ
c++·算法·leetcode·周赛·lenyiin
数据的世界013 小时前
.NET开发人员学习书籍推荐
学习·.net
四口鲸鱼爱吃盐3 小时前
CVPR2024 | 通过集成渐近正态分布学习实现强可迁移对抗攻击
学习
Uu_05kkq3 小时前
【C语言1】C语言常见概念(总结复习篇)——库函数、ASCII码、转义字符
c语言·数据结构·算法
OopspoO5 小时前
qcow2镜像大小压缩
学习·性能优化
嵌入式科普6 小时前
十一、从0开始卷出一个新项目之瑞萨RA6M5串口DTC接收不定长
c语言·stm32·cubeide·e2studio·ra6m5·dma接收不定长
A懿轩A6 小时前
C/C++ 数据结构与算法【栈和队列】 栈+队列详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·栈和队列