#谷歌面试题#,http://blog.sina.com.cn/s/blog_979956cc0101hd0f.html
给你一个数组,它有N个8-bit整数, (比如,从0到255), 和M个子数组,[i, j] (每个子数组由两个下标 i 和 j 确定,0 <= i <= j < N)。对每个子数组,找到平均值和中值
分析:假设仅需要求一个子数组,则我们可以在线性时间内求出平均值和中值。
case 1:M很小,则可以用M次brute-force算法求出,时间复杂度O(M*N),空间复杂度O(1)
case 2: M很大,N较小, M >> N^2,则可以预处理,用O(N^2)的空间存储所有M个子数组可能的结果,预处理时间O(N^2),M次查询时间为O(M)
case 3: N较大时,
1) 平均值:计算累加和sum[i] 为从0到i的求和,则mean(i, j) = sum(i, j) / (j - i + 1) = ( sum[j] - sum[i-1]) / (j - i + 1), 预处理时间O(N),空间O(N),M次查询时间O(M)
2)中值:与平均值类似,计算累加的统计频数,c[i][ ]为从0到i这i+1个值在0~255上的分别出现次数的数组,利用c[j][ ] - c[i-1][ ]即可求出[i, j]之间所有数在0~255上出现的频数数组,根据这个数组可在O(256)时间内求出中值, 预处理时间O(N),空间O(N),M次查询时间O(M)
用到等式S[I --J]=S[J] –S[I];