算法题,做了近一天
原题出处,由July提供并解析,
http://blog.csdn.net/v_july_v/article/details/8701148
自己独立做,一开始方向有偏差。最后独立思路写了一个超容易出bug调了半天的O(n):
目前该程序至少在1000个以1~20长度以-20.0到20.0随机浮点数为元素的随机序列上和参考算法(穷举法)对比测试通过。
public static double MPCSolveQb2(this double[] seq, out int start, out int count) { start = 0; count = seq.Length; if (seq.Length == 1) { return seq[0]; } var maxp = 0.0; var maxpstart = 0; var maxpcount = 0; var maxn = 0.0; var maxnstart = 0; var maxncount = 0; var prevMax = double.MinValue; for (var i = 0; i <= seq.Length; i++) { var v = i == seq.Length ? 0 : seq[i]; if (v > 0) { if (maxp <= 1) { maxp = v; maxpstart = i; maxpcount = 1; } else { if (v < 1 && maxp > prevMax) { prevMax = maxp; start = maxpstart; count = maxpcount; } maxp *= v; maxpcount++; } if (maxncount > 0) { maxn *= v; maxncount++; } } else if (v < 0) { var oldmaxp = maxp; var oldmaxpstart = maxpstart; var oldmaxpcount = maxpcount; if (maxp > prevMax) { prevMax = maxp; start = maxpstart; count = maxpcount; } maxp = 0; maxpcount = 0; if (maxncount > 0) { var tmaxp = maxn * v; if (tmaxp > maxp) { maxp = tmaxp; maxpstart = maxnstart; maxpcount = maxncount + 1; } } if (oldmaxpcount > 0 && oldmaxp > 1) { var tmaxn = oldmaxp*v; maxn = tmaxn; maxnstart = oldmaxpstart; maxncount = oldmaxpcount + 1; } else { maxn = v; maxnstart = i; maxncount = 1; } } else // v==0 { if (maxp > prevMax) { prevMax = maxp; start = maxpstart; count = maxpcount; } maxn = 0; maxp = 0; } } return prevMax; }
enjoy every minute of an appless, googless and oracless life