算法第三十一天-区域和检索【数组不可变】

区域和检索-数组不可变

题目要求

在这里插入图片描述

解题思路

为方便描述,把 n u m s nums nums 记作 a a a
对于数组 a a a,定义它的前缀和
s [ 0 ] =   0 s [ 1 ] =   a [ 0 ] s [ 2 ] =   a [ 0 ] + a [ 1 ] ⋮ s [ i ] =   a [ 0 ] + a [ 1 ] + ⋯ + a [ i − 1 ] = ∑ j = 0 i − 1 nums [ j ] s [ i + 1 ] =   a [ 0 ] + a [ 1 ] + ⋯ + a [ i − 1 ] + a [ i ] = ∑ j = 0 i nums [ j ] ⋮ s [ n ] =   a [ 0 ] + a [ 1 ] + ⋯ + a [ n − 1 ] \begin{aligned} s[0] =\ &0\\ s[1] =\ &a[0]\\ s[2] =\ &a[0]+a[1]\\ &\vdots\\ s[i] =\ &a[0] + a[1] + \cdots + a[i-1] = \sum\limits_{j=0}^{i-1}\textit{nums}[j]\\ s[i+1] =\ &a[0] + a[1] + \cdots + a[i-1] + a[i] = \sum\limits_{j=0}^{i}\textit{nums}[j]\\ &\vdots\\ s[n] =\ &a[0] + a[1] + \cdots + a[n-1] \end{aligned} s[0]= s[1]= s[2]= s[i]= s[i+1]= s[n]= 0a[0]a[0]+a[1]a[0]+a[1]++a[i1]=j=0i1nums[j]a[0]+a[1]++a[i1]+a[i]=j=0inums[j]a[0]+a[1]++a[n1]

根据这个定义,有

s [ i + 1 ] = s [ i ] + a [ i ] s[i+1]=s[i]+a[i] s[i+1]=s[i]+a[i]
示例中的数组 [ − 2 , 0 , 3 , − 5 , 2 , − 1 ] [−2,0,3,−5,2,−1] [2,0,3,5,2,1],对应的前缀和数组 s = [ 0 , − 2 , − 2 , 1 , − 4 , − 2 , − 3 ] s=[0,−2,−2,1,−4,−2,−3] s=[0,2,2,1,4,2,3]
通过前缀和,我们可以把连续子数组的元素和转换成两个前缀和的差, a [ l e f t ] a[left] a[left] a [ r i g h t ] a[right] a[right]的元素和等于

∑ j = left right a [ j ] = ∑ j = 0 right a [ j ] − ∑ j = 0 left − 1 a [ j ] = s [ right + 1 ] − s [ left ] \sum_{j=\textit{left}}^{\textit{right}}\textit{a}[j] = \sum\limits_{j=0}^{\textit{right}}\textit{a}[j] - \sum\limits_{j=0}^{\textit{left}-1}\textit{a}[j] = \textit{s}[\textit{right}+1] - \textit{s}[\textit{left}] j=leftrighta[j]=j=0righta[j]j=0left1a[j]=s[right+1]s[left]

有了这个式子,示例中子数组 [ 3 , − 5 , 2 , − 1 ] [3,−5,2,−1] [3,5,2,1]的和,就可以 O ( 1 ) O(1) O(1)地用 s [ 6 ] − s [ 2 ] = − 3 − ( − 2 ) = − 1 s[6]−s[2]=−3−(−2)=−1 s[6]s[2]=3(2)=1算出来。

复杂度分析

  • 时间复杂度:初始化 O ( n ) O(n) O(n),其中 n n n n u m s nums nums的长度。 s u m R a n g e O ( 1 ) sumRange O(1) sumRangeO(1)
  • 空间复杂度: O ( n ) O(n) O(n)

参考

灵茶山艾府

  • 22
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

alstonlou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值