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

题目:力扣-303

给定一个整数数组 nums,处理以下类型的多个查询:

计算索引 left 和 right (包含 left 和 right)之间的 nums 元素的 和 ,其中 left <= right,sumRange(int i, int j) 返回数组 nums 中索引 left 和 right 之间的元素的 总和 ,包含 left 和 right 两点(也就是 numsleft + numsleft + 1 + ... + numsright )

解决思路:

方法一:暴力破解,累加left到right之间的元素,效率低

方法二:计算给定数组的前缀和,计算结果放入新数组arrayi

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%

相关推荐
M78佐菲1 分钟前
ARM学习笔记(四)
linux·arm开发·笔记·嵌入式硬件·学习
昌原的儿子LEO4 分钟前
i.MX6ULL 裸机开发 C 语言驱动与 BSP 工程管理学习总结
linux·arm开发·学习
布莱克6056 分钟前
理解内存泄漏:成因、发现方法与解决策略(C++ 举例)
c语言·c++·内存泄漏
kkkkkkkkkk_Z18 分钟前
单片机|学习日记:单片机底层架构与寄存器操作全解析
linux·笔记·单片机·学习·51单片机
逐辰十七44 分钟前
2023级河海大学自动化计算机控制考试题目
学习
Logic1011 小时前
C语言/数据结构位运算题解:异或XOR找出英雄升级系统中的“独特经验值“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
一只路人甲10 小时前
使用AI快速学习
学习
传奇开心果编程11 小时前
【Rust入门练中学】第2课:变量、可变性与常量
开发语言·学习·rust
Navigator_Z12 小时前
LeetCode //C - 1252. Cells with Odd Values in a Matrix
c语言·算法·leetcode
边境悍匪13 小时前
蜗牛学苑 Java 智能体学习 Day42|项目周开发技术汇总 1 思维导图复盘
java·开发语言·spring boot·学习·spring