一组数据有M(M>2)个字符, 由随机的0或1组成. 从第1个数字到第N(2<N<=M)个数字, 求出现1的概率最大值X。
条件:
示例数据:
甲 10011 11001 00000
已 00011 01001
丙 11110 11000 00
现假设 R=1/2;
如甲组数据:有15个数字(M=15),当N=5时,从第1个数字开始数到第5个, 1出现的概率x= 3/5; N=6,1出现的概率是x= 4/6,N=7,概率是x=5/7...一直到 N=15,概率是x= 6/15, 返回最大概率值x= 5/7
乙组数据, M=10, 不论N为几, 概率都小于R, 不用计算
丙组数据, M=12, N为3或4时, 计算的概率都是1, 但不满足第二个限制条件, 则不能取值1,而是往后继续计算最大值X=6/7
求最优算法,语言不限. 注意: M的值可能非常大,请考虑性能
无论使用哪种方式,最优的结果也至少要遍历一遍数组,所以他的时间复杂度最低也是O(n)。
var max = 0;
var len0 = 0;
var len1 = 0;
for(var i=0;i<arr.length;i++)
{
if(arr[i]==0)
len0++;
else
len1++;
var result = len1 / (len1+len0);
if(result > max && ((result!=1 && i<5) || i>=5))
max = result;
}
if(max>R)
print(max);
某些情况下不用遍历所有数组元素,比如前6个都是1,那最大占比就是1了
@会长: 对的,这里还要加一个条件,如果i>5 && max==1 break跳出循环,但是这是条件,对于算法时间复杂度来说就是O(n)
我想到一个减少计算占比次数的方法:假设现在占比最高点在i,现在遍历到了j:
如果 j和i相邻,此时,如果j点是'1",占比必然变大,无需计算,只需要把i赋值j;如果j点是0,占比必然减少,什么也不做
如果j和i不相邻,需要计算j点和i点哪个占比大,如果j点占比大,i赋值j
遍历过程中需要记录”1“出现的次数,方便计算占比。
不是很明白其中"最高点","相邻"这种说法怎么呈现, 能烦请用代码展示看下吗?
@Pawpsicle: 等我有空的啊,现在有点忙