手寫無明顯bug演算法
- 給定一個陣列序列, 需要求選出一個區間, 使得該區間是所有區間中經過如下計算的值最大的一個:
區間中的最小數 × 區間所有數的和最後程式輸出經過計算後的最大值即可,不需要輸出具體的區間。如給定序列 [6 2 1]則根據上述公式, 可得到所有可以選定各個區間的計算值:
[6] = 6 * 6 = 36;
[2] = 2 * 2 = 4;
[1] = 1 * 1 = 1;
[6,2] = 2 * 8 = 16;
[2,1] = 1 * 3 = 3;
[6, 2, 1] = 1 * 9 = 9;
輸入例子1:
3
6 2 1
輸出例子1:
36
思路描述:
首先解必然存在,假設解以分別以每一個元素為最小元素來向前後擴充套件該序列,對拿到的n個序列求max
$n = 3;
$a = [6, 2, 1];
function max_min_sum($a)
{
$max = 0;
foreach ($a as $i => $aa) {
$tmp = subb($a, $i);
if($tmp > $max) $max = $tmp;
}
return $max;
}
function subb($a, $min_index)
{
$l = $r = $min_index;
$len = count($a);
$sum = $a[$min_index];
while($l-1 >= 0 && $a[$l-1] >= $a[$min_index]){
$l--;
$sum += $a[$l];
}
while($r+1 < $len && $a[$r+1] >= $a[$min_index]){
$r++;
$sum += $a[$r];
}
// return [$l, $r];
return $a[$min_index]*$sum;
}
echo max_min_sum($a);
本作品採用《CC 協議》,轉載必須註明作者和本文連結