找到数组中的最大总和

时间:2011-02-22 05:56:15

标签: php arrays algorithm

我的问题有一个可行的解决方案,但现在我想改进它。

考虑数组

3,4,5,9,1,2,8

我需要找到位置ij的两个元素之间的最大差异,这样i < j我希望找到第二个元素之后的两个元素之间的最大差异第一个元素。

在输入中,我给出的答案是7,因为8-1 = 78位于1之后。

该程序可以工作,但是当我有一个非常大的数组时,它需要很多时间。我们能改进吗?

function fMax($arr) 
{
        $sum = $arr[1] - $arr[0];

        for($i=0;$i<count($arr);$i++) 
        {
                for($j=$i+1;$j<count($arr);$j++) 
                {
                        if($sum < $arr[$j] - $arr[$i]) 
                        {
                                $sum = $arr[$j] - $arr[$i];
                        }
                }
        }
        return $sum;
}

非常感谢所有答案。我已经通过codeaddict使用了代码,它运行得很快。

3 个答案:

答案 0 :(得分:6)

您当前的方法是O(N^2),您可以将其改进为O(N)

您正在将每个元素与每个其他元素进行比较。相反,您可以跟踪到目前为止看到的最大差异和最小元素。

所以每次测试新元素时都会看到

  • 如果它与当前的差异 如果是这样,min将给出更好的最大值 更新最大金额和
  • 如果该数字小于最小值 到目前为止,你更新了分钟。

PHP函数:

function ImprovedFindMax($arr) {
    // initial max sum.
    $sum = $arr[1] - $arr[0];

    // initial min.
    $min = $arr[0];

    // iterate for every other ele starting from 2nd.
    for($i=1;$i<count($arr);$i++) {
            // if this ele give larger sum then update sum.
        if($arr[$i] - $min > $sum) {
            $sum = $arr[$i] - $min;
        }

            // if this ele is smaller than min..update min.
        if($arr[$i] < $min) {
            $min = $arr[$i];
        }
    }

    // return $sum which will be the max sum.
    return $sum;
}

Ideone Link

答案 1 :(得分:5)

一次迭代,跟踪最小值和最大值。在每个元素处,如果该值小于最小值,则将最小值设置为该值;否则,如果值 - minimum大于maxdiff,则将maxdiff设置为该差异。将其从O(n ^ 2)变为O(n)。

答案 2 :(得分:0)

这应该有效。我还没有测试过。

$arr = array(3,4,5,9,1,2,8);

$min = PHP_INT_MAX;
$maxdiff = 0;

foreach($arr as $i) {
  if ($i < $min) {
    $min = $i;
  }

  if ($maxdiff < $i - $min) {
    $maxdiff = $i - $min;
  }
}

echo "maxdiff: {$maxdiff}\n";