LeetCode303. 区域和检索 - 数组不可变

本文提供了一种高效解答LeetCode第303题“区域和检索-数组不可变”的方法,通过预处理数组实现快速求和,避免了多次遍历带来的效率问题。示例代码展示了如何创建和使用NumArray类来处理数组求和问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

借鉴了别人的答案,比我自己的巧妙的多。

原答案:https://leetcode-cn.com/problems/range-sum-query-immutable/solution/cyu-yan-gen-ben-bu-xu-yao-te-shu-chu-li-by-weeping/

/**
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);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值