区域和检索-数组不可变
题目要求
解题思路
为方便描述,把 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[i−1]=j=0∑i−1nums[j]a[0]+a[1]+⋯+a[i−1]+a[i]=j=0∑inums[j]⋮a[0]+a[1]+⋯+a[n−1]
根据这个定义,有
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=left∑righta[j]=j=0∑righta[j]−j=0∑left−1a[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)。
参考
灵茶山艾府