我的问题有一个可行的解决方案,但现在我想改进它。
考虑数组
3,4,5,9,1,2,8
我需要找到位置i
和j
的两个元素之间的最大差异,这样i < j
我希望找到第二个元素之后的两个元素之间的最大差异第一个元素。
在输入中,我给出的答案是7
,因为8-1 = 7
和8
位于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使用了代码,它运行得很快。
答案 0 :(得分:6)
您当前的方法是O(N^2)
,您可以将其改进为O(N)
。
您正在将每个元素与每个其他元素进行比较。相反,您可以跟踪到目前为止看到的最大差异和最小元素。
所以每次测试新元素时都会看到
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;
}
答案 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";