2017-03-07 67 views
1

給定一個數組A由四個元素的最大遙遠查找元素:如何在一個陣列,其值是從平均

$arr = array(9, 4, -3, -10); 

該數組的平均值是(9 + 4 + (−3) + (−10))/4 = 0

元素A[2]的偏差是|(-3) - 0| = |0 - (-3)| = 3

元件A[3]的偏差爲10。陣列A的極端元件中,由於沒有其它的元件具有的偏差大於10

有此數組中沒有其他極端元件。

我具有以下溶液:

<?php 
$array = array(9, 4, -3, -10); 
$rslt = soln($array); 

function soln($A){ 
    $avg = array_sum($A)/count($A); 

    $eE = 0; 
    for($i = 0; $i < count($A); $i++){ 
     if (abs($avg - $A[$i]) > $eE): 
      $eE = $i; 
     endif; 
    } 
    if ((int)$eE > 100000000) { 
     return -1; 
    } else { 
     return (int)$eE; 
    } 
} 

但是這種解決方案是不完全正確的基於O(N)和O(升)

回答

0

距平均值的最大遙遠元件將是一MAX或MIN元素。因此,您需要的只是在計算數組總和的同一週期中查找MAX和MIN元素。然後,您將根據陣列總數和陣列中的元素數量找到平均值(就像您一樣)。然後你將只檢查兩個元素,MAX和MIN--它們中的哪一個距離最遠。

代碼的示例:

function soln($arr){ 
    $sum = 0; 

    $max = PHP_INT_MIN; 
    $min = PHP_INT_MAX; 

    foreach($arr as $el){ 
    if($el > $max){ 
     $max = $el; 
    } 

    if($el < $min){ 
     $min = $el; 
    } 

    $sum = $sum + $el; 
    } 

    $avg = $sum/count($arr); 

    if(abs($avg - $min) > abs($avg - $max)){ 
    return $min; 
    }else{ 
    return $max; 
    } 
} 
+0

我需要找到一種極端的元素的索引。如果存在多個極值,那麼它應該返回其中任何一個的索引 – sanin

+0

,因此只需修改此代碼,將max和min存儲爲max和min的數組,然後存儲相應的索引。而你的問題是「一個元素」而不是「元素」:)。至少你可以使用'array_keys' –