日拱一卒,月进一步(10)

303. 区域和检索 - 数组不可变 - 力扣(LeetCode)

动态规划~

前缀和

最朴素的思想是存储数组nums的值,每次调用sumRange时,通过循环的方法计算数组nums从下标i到下标j的元素和,需要计算j-i+1个元素的和。由于每次检索的时间和检索的下标范围有关,因此检索的时间复杂度较高,如果检索的次数过多,会超出时间限制。

我们应该尽量降低sumRange的时间复杂度,最理想的时间复杂度是O(1)。

因此,要计算sumRange(i,j),则需要计算数组nums在下标i-1和j的前缀和,并计算两个前缀和的差。如果可以在初始化时就计算nums在每个下标的前缀和。即可满足调用sumRange的时间复杂度都是O(1)。

具体实现方面,假设数组的长度nums等于n,创建长度为n+1的前缀和数组nums,sums[i+1]=sums[i]+nums[i],则sums[i]表示数组从0到下标i-1的前缀和。

将前缀和数组 sum 的长度设为 n+1的目的是为了方便计算 sumRange(i,j),不需要对 i=0的情况特殊处理。此时有:




typedef struct {
    int* sums;
} NumArray;


NumArray* numArrayCreate(int* nums, int numsSize) {
    NumArray* ret=malloc(sizeof(NumArray));
    ret->sums=malloc(sizeof(int)*(numsSize+1));
    ret->sums[0]=0;
    for(int i=0;i<numsSize;i++)
    {
        ret->sums[i+1]=ret->sums[i]+nums[i];
    }
    return ret;
    }

int numArraySumRange(NumArray* obj, int i, int j) {
    return obj->sums[j+1]-obj->sums[i];
}

void numArrayFree(NumArray* obj) {
    free(obj->sums);
}

/**
 * Your NumArray struct will be instantiated and called as such:
 * NumArray* obj = numArrayCreate(nums, numsSize);
 * int param_1 = numArraySumRange(obj, left, right);
 
 * numArrayFree(obj);
*/

相关推荐

  1. 进一步10

    2024-05-02 02:28:02       32 阅读
  2. 进一步13

    2024-05-02 02:28:02       40 阅读
  3. 进一步16

    2024-05-02 02:28:02       36 阅读
  4. 1213总结

    2024-05-02 02:28:02       74 阅读
  5. 1211总结

    2024-05-02 02:28:02       66 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-02 02:28:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-02 02:28:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-05-02 02:28:02       82 阅读
  4. Python语言-面向对象

    2024-05-02 02:28:02       91 阅读

热门阅读

  1. Quartz.Net技术教学:构建高效的任务调度系统

    2024-05-02 02:28:02       27 阅读
  2. Zotero 使用

    2024-05-02 02:28:02       31 阅读
  3. 网络培训议题@2

    2024-05-02 02:28:02       28 阅读
  4. midjourney简单使用体验

    2024-05-02 02:28:02       37 阅读