区域和检索-数组不可变
题目要求
解题思路
为方便描述,把
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)。
参考
灵茶山艾府