cheng_you_know

学而时习之!

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

#谷歌面试题#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];

posted on 2013-08-01 21:51  cheng_you_know  阅读(357)  评论(0)    收藏  举报