小演算法

LJ2016發表於2019-06-14

手寫無明顯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 協議》,轉載必須註明作者和本文連結

相關文章