LeetCode238扩展:https://blog.csdn.net/mooneve/article/details/93631477
求数组中除了自己以外所有数的方差
方差计算公式为:
E
[
∑
i
=
0
n
(
X
i
−
X
m
e
a
n
)
2
]
=
E
[
∑
i
=
0
n
(
X
i
2
−
2
X
i
X
m
e
a
n
+
X
m
e
a
n
2
)
]
=
E
(
X
2
)
−
X
m
e
a
n
2
E[\sum_{i=0}^n(X_i-X_{mean})^2] = E[\sum_{i=0}^n(X_i^2-2X_iX_{mean}+X_{mean}^2)] \\ =E(X^2)-X_{mean}^2
E[i=0∑n(Xi−Xmean)2]=E[i=0∑n(Xi2−2XiXmean+Xmean2)]=E(X2)−Xmean2
因此,维护
X
2
X^2
X2与
X
m
e
a
n
X_{mean}
Xmean即可。其中每一项的
X
m
e
a
n
X_{mean}
Xmean可以通过
(
s
u
m
(
X
)
−
X
i
)
/
n
−
1
(sum(X)-X_i)/n-1
(sum(X)−Xi)/n−1求得。
C++代码
class Solution {
public:
vector<double> varianceExceptSelf(vector<double>& nums) {
int n = nums.size();
vector<double> variance(n);
double sumX2 = 0;
double sumX = 0;
for (int i = 0; i < n ; ++i) {
sumX2 += nums[i] * nums[i];
sumX += nums[i];
}
for (int i = 0; i < n; ++i) {
double E_X2 = (sumX2 - nums[i] * nums[i]) / (n - 1);
double EX_2 = ((sumX - nums[i]) / (n - 1)) * ((sumX - nums[i]) / (n - 1));
variance[i] = E_X2 - EX_2;
}
return variance;
}
};
Python代码
class Solution:
def varianceExceptSelf(self, nums):
n = len(nums)
variance = [1 for _ in range(n)]
sumX = 0.0
sumX2 = 0.0
for i in range(n):
sumX += nums[i]
sumX2 += nums[i] * nums[i]
for i in range(n):
Ex_2 = ((sumX - nums[i]) / (n - 1)) * ((sumX - nums[i]) / (n - 1))
E_X2 = (sumX2 - nums[i] * nums[i]) / (n - 1)
variance[i] = E_X2 - Ex_2
return variance