149 N个数排列 其中一个数被替换 求复杂度

来源:互联网 发布:实况巅峰数据图拉姆 编辑:程序博客网 时间:2024/05/16 12:27
49、08 百度校园招聘的一道笔试题 
题目大意如下:
一排 N(最大 1M)个正整数+1 递增,乱序排列,第一个不是最小的,把它换成-1,

最小数为a且未知求第一个被-1 替换掉的数原来的值,并分析算法复杂度。


解答:
设这一排数是A1、A2、A3、…、AN,这N个数分别是: a, a+1, a+2, …, a+n
  被替换掉的数为X,则X变成了-1。 
  SumA = A1+A2+A3+…+AN(其中有个-1)
  SumB =a+(a+1)+…+(a+n)
  则 SumB-SumA=X-(-1)=X + 1 其余抵消 

处理溢出情况:1M=10^6  2^20= 1048576
  和的最大范围a + … + 2^20 ≈ 1+…+ 2^20 ≈ (1+2^20)* 2^20/2 =2^40。
使用4字节的int会溢出,64位的long long可以搞定 

使用辅助数组data,数组的元素是Ai-(a+i-1)。则data的所有元素之和恰好是SumB – SumA。
现在要说明的是:对data的所有元素求和不会溢出。
  
最好情况下,这一排数{A1、A2、A3、…、AN}的顺序基本和{ a, a+1, a+2, …, a+n }相同,
这样除了第一个元素,其余元素对应相减都为0,因此不会溢出。
最坏情况下,{A1、A2、A3、…、AN}递减排列,{ a, a+1, a+2, …, a+n }递增排列。
此时,data的前N/2个元素为正,后N/2个元素为负。相加求和时,只要前N/2个元素的和不溢出,则结果不溢出。
这时,前N/2个元素分别为:(a+n)-(a), (a+n-1)-(a+1), (a+n-2)-(a+2),…2, 0
则,前N/2个元素的和:(((a+n)-(a))*n/2)/2 = n^2/4≈(2^20)^2/4≈ 2^40


0 0
原创粉丝点击