如何在不使用 max 函数的情况下找到数组中的最大和第二大数字

问题描述 投票:0回答:11

我已经有解决方案了。但我认为它会更加优化。所以请为我提供一个解决方案。并记住不要使用 php 的预定义函数。就像 max() 函数一样。 我知道有很多方法可以找到它,但我想要最好的解决方案。因为我的数组包含超过 10 万条记录,并且需要花费大量时间。或者有时网站会关闭。

我的代码:

<?php 

$array = array('1', '15', '2','10',4);

echo "<pre>";
print_r($array);
echo "<pre>";
$max = 0;
$s_max=0;

for($i=0; $i<count($array); $i++)
{
    $a = $array[$i];
    $tmax = $max;
    $ts_max = $s_max;
    if($a > $tmax && $a > $ts_max)
    {
        $max = $a;
        if($tmax > $ts_max) {
            $s_max = $tmax;
        } else {
            $s_max = $ts_max;
        }
    } else if($tmax > $a && $tmax > $ts_max)
    {
        $max = $tmax;
        if($a > $ts_max) {
            $s_max = $a;
        } else {
            $s_max = $ts_max;
        }
    } else if($ts_max > $a && $ts_max > $tmax)
    {
        $max = $ts_max;
        if($a > $tmax)
        {
            $s_max = $a;
        } else {
            $s_max = $tmax;
        }
    }
}
echo "Max=".$max;
    echo "<br />";
    echo "S_max=".$s_max;
    echo "<br />";

?>
php arrays
11个回答
8
投票
<?php 
$array = array('200', '15','69','122','50','201');
$max_1 = $max_2 = 0;

for ($i=0; $i<count($array); $i++) {
    if ($array[$i] > $max_1) {
      $max_2 = $max_1;
      $max_1 = $array[$i];
    } else if ($array[$i] > $max_2 && $array[$i] != $max_2) {
      $max_2 = $array[$i];
    }
}
echo "Max=".$max_1;
echo "<br />"; 
echo "Smax 2=".$max_2;

6
投票

请参阅此解决方案。

<?php 

 $numbers = array_unique(array(1,15,2,10,4)); 
// rsort : sorts an array in reverse order (highest to lowest).

 rsort($numbers); 

 echo 'Highest is -'.$numbers[0].', Second highest is -'.$numbers[1];

 // O/P: Highest is -15, Second highest is -10
 ?>

1
投票

我没有检查你的解决方案,但就复杂性而言,IMO 是最佳的。如果数组没有更多的结构信息(比如已排序),则无法跳过条目。 IE。最好的解决方案是 O(n),您的解决方案就是。


1
投票

这是一个完美且最短的代码,用于从数组中找出第二大值。如果数组仅包含一个值,下面的代码将始终返回值。

Example 1.
    $arr = [5, 8, 1, 9, 24, 14, 36, 25, 78, 15, 37];
    asort($arr);
    $secondLargestVal = $arr[count($arr)-1];

    //this will return 37

Example 2.

    $arr = [5];
    asort($arr);
    $secondLargestVal = $arr[count($arr)-1];
    //this will return 5

0
投票

您还可以使用冒泡排序等排序技术

function bubble_Sort($my_array )
{
    do
    {
        $swapped = false;
        for( $i = 0, $c = count( $my_array ) - 1; $i < $c; $i++ )
        {
            if( $my_array[$i] > $my_array[$i + 1] )
            {
                list( $my_array[$i + 1], $my_array[$i] ) =
                        array( $my_array[$i], $my_array[$i + 1] );
                $swapped = true;
            }
        }
    }
    while( $swapped );
return $my_array;
}

$test_array = array(3, 0, 2, 5, -1, 4, 1);
echo "Original Array :\n";
echo implode(', ',$test_array );
echo "\nSorted Array\n:";
echo implode(', ',bubble_Sort($test_array)). PHP_EOL;

Original Array :                                                    
3, 0, 2, 5, -1, 4, 1                                                
Sorted Array :                                                      
-1, 0, 1, 2, 3, 4, 5

流程说明


0
投票
$array = array(80,250,30,40,90,10,50,60,50);            // 250  2-times
$max = $max2 = 0;

foreach ($array as $key =>$val) {
    if ($max < $val) {
        $max2 = $max;
        $max = $val;        
    } elseif ($max2 < $val && $max != $val) {
        $max2 = $val;
    }
}

echo "Highest Value is : " . $max . "<br/>";           //output: 250
echo "Second highest value is : " . $max2 . "<br/>";   //output: 90

0
投票

您可以尝试以下代码

<?php

$array = array('1', '15', '2','10', 4);
$max_number = $second_max = PHP_INT_MIN;

foreach ($array as $value) {
    $number = (int)$value; // convert value into integer
    
    if ($number > $max_number) {
        $second_max = $max_number;
        $max_number = $number;
    } elseif ($number > $second_max && $number != $max_number) {
        $second_max = $number;
    }
}

echo "Max = $max_number";
echo "Second Max = $second_max";
?>

-1
投票

“Kanishka Panaldeniya”给出的答案对于最高值来说是可以的,但对于第二高值会失败,即如果数组有 2 个相似的最高值,那么它将显示相同的最高值和第二高值。我已经通过添加一个级别比较来整理它,并且效果很好。

$array = array(50,250,30,250,40,70,10,50); // 250  2-times
$max=$max2=0;
for ($i = 0; $i < count($array); $i++) {
if ($array[$i] > $max) {
    $max2 = $max;
    $max = $array[$i];
} else if (($array[$i] > $max2) && ($array[$i] != $max)) {
    $max2 = $array[$i];
}
}
echo "Highest Value is : " . $max . "<br/>"; //output : 250
echo "Second highest value is : " . $max2 . "<br/>"; //output : 70

-1
投票

此代码将从数组返回第二个最大值

$array = array(80,250,30,250,40,90,10,50,60,50); // 250  2-times
$max=$max2=0;

for ($i = 0; $i < count($array); $i++) {
    if($i == 0) {
        $max2 = $array[$i];
    }
     
    if($array[$i] > $max) {
        $max = $array[$i];
    }
    
    if($max > $array[$i] && $array[$i] > $max2) {
        $max2 = $array[$i];
    }
}    


echo "Highest Value is : " . $max . "<br/>"; //output : 250
echo "Second highest value is : " . $max2 . "<br/>"; //output : 90

-1
投票
Two way find the second highest salary 
1. Sort the data in Descending order
2. get array first value
3. Check the condition already comments

$array =  [2,3,6,11,17,14,19];
$max   =  $array[0];
$count =  count($array);
for($i=0; $i<$count;$i++)
{
      for($j=$i+1;$j<$count;$j++)
      {
         if($array[$i] < $array[$j])
         {
            $temp = $array[$i];
            $array[$i] = $array[$j];
            $array[$j] = $temp;
         }
      }
}

First Method
//echo $array[1]; // Second highest value

$second ='';
for($k=0;$k<2;$k++)
{
    if($array[$k] >$max)
    {
        $second = $array[$k];       
    }
}
echo $second; // Second method

-1
投票

不使用MAX功能。在这里。

$arr = [3,4,-5,-3,1,0,4,4,4];
rsort($arr); // SORT ARRAY IN DESCENDING ORDER

$largest = $arr[0]; // IN DESCENDING ORDER THE LARGEST ELEMENT IS ALWAYS THE FIRST ELEMENT

$secondLargest = 0;

foreach($arr as $val){
    $secondLargest = $val; // KEEP UPDATING THE VARIABLE WITH THE VALUE UNTIL IT RECEIVES THE FIRST ELEMENT WHICH IS DIFFERENT FROM THE LARGEST VALUE
    
    if($val != $arr[0]){
        break; // BREAK OUT OF THE LOOP AS SOON AS THE VALUE IS DIFFERENT THAN THE LARGEST ELEMENT
    }
}

echo $secondLargest;
© www.soinside.com 2019 - 2024. All rights reserved.