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

简介: 303. 区域和检索 - 数组不可变 - 力扣(LeetCode)动态规划~

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

动态规划~

前缀和、

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


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

218167e9642594e7f2e4b5aed2b2a74f_f2de7617dd524282ad258d64ac788b1b.png

因此,要计算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的情况特殊处理。此时有:

8c4eab9c58563be4182edf8f6216a13c_f093d787649c44d7bbfb3a10064d3365.png

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


8c4eab9c58563be4182edf8f6216a13c_f093d787649c44d7bbfb3a10064d3365.png

相关文章
|
存储 运维 数据处理
AIGC浪潮对数据中心基础设施发展的影响
【1月更文挑战第19天】AIGC浪潮对数据中心基础设施发展的影响
382 1
AIGC浪潮对数据中心基础设施发展的影响
|
小程序 开发者
uni-app语音转文字功能demo(同声传译)
uni-app语音转文字功能demo(同声传译)
|
机器学习/深度学习 算法 安全
DTU是物联网发展的重要技术吗
简述什么是DTU以及相关理解
|
11月前
ThreeJs控制模型的隐藏与显示
这篇文章讲解了如何在Three.js中通过代码控制3D模型的显示与隐藏状态。
173 3
ThreeJs控制模型的隐藏与显示
|
12月前
|
存储 Java Serverless
【数据结构】哈希表&二叉搜索树详解
本文详细介绍了二叉搜索树和哈希表这两种数据结构。二叉搜索树是一种特殊二叉树,具有左子树节点值小于根节点、右子树节点值大于根节点的特点,并且不允许键值重复。文章给出了插入、删除和搜索等方法的具体实现。哈希表则通过哈希函数将键名映射为数组下标,实现快速查找,其插入、删除和查找操作时间复杂度理想情况下为O(1)。文中还讨论了哈希函数的设计原则、哈希冲突的解决方法及哈希表的实现细节。
241 8
【数据结构】哈希表&二叉搜索树详解
|
人工智能 弹性计算 定位技术
【云故事探索】NO.4: 千寻位置,时空智能赋能行业数字化转型
千寻位置,成立于2015年,利用北斗卫星系统及全球5000多座增强站,提供厘米级定位服务。该公司借助阿里云的计算能力,为汽车、农业等多个行业提供高精度时空智能解决方案,推动行业转型升级。千寻已完成超130亿元估值的A轮融资,展现了其在时空智能领域的领先地位。通过云上部署,千寻优化服务质量和市场扩展,应对突发流量,计划进一步全球化并应用AI技术。阿里云的支持对于千寻的成功至关重要,双方合作将时空智能服务推向国际。
【云故事探索】NO.4: 千寻位置,时空智能赋能行业数字化转型
|
存储 NoSQL 测试技术
go最佳实践:如何舒适地编码
go最佳实践:如何舒适地编码
|
Java 调度 开发者
如何在Java中实现任务调度
如何在Java中实现任务调度
flutter 引用图片资源遇到的问题
flutter 引用图片资源遇到的问题
229 1
|
Java 编译器 开发工具
Java(四):高效调试之IDEA热启动
Java(四):高效调试之IDEA热启动
548 0
Java(四):高效调试之IDEA热启动