簡體   English   中英

如何在不使用最大值 function 的情況下找到數組中的最高和第二高的數字

[英]how to find highest and second highest number in an array without using max function

我已經有解決方案了。 但我認為它會更加可優化。 所以請給我一個解決方案。 請記住,不要使用 php 的預定義 function。例如 max() function。我知道有很多方法可以找到它,但我想要最好和更好的解決方案。 因為我的數組包含超過 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 
$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) {
      $max_2 = $array[$i];
    }
}
echo "Max=".$max_1;
echo "<br />"; 
echo "Smax 2=".$max_2;

請參閱此解決方案。

<?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
 ?>

我沒有檢查您的解決方案,但就復雜性而言,它是 IMO 最佳的。 如果數組沒有更多的結構信息(如已排序),則無法跳過條目。 即最好的解決方案是在 O(n) 中,您的解決方案是。

這是從數組中找出第二大值的完美且最短的代碼。 如果數組只包含一個值,下面的代碼將始終返回值。

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

“Kanishka Panamaaldeniya”給出的答案適用於最高值,但在第二高值時會失敗,即如果數組具有兩個相似的最高值,那么它將顯示最高值和第二高值相同。 我通過添加更多級別的比較對其進行了整理,並且效果很好。

$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

此代碼將從數組中返回第二個最大值

$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
$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

您還可以使用諸如冒泡排序之類的排序技術

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

流程說明在此處輸入圖片說明

請參閱此解決方案,PHP 在沒有內置排序的情況下找到給定數組中的第二大元素 function

<?php

function secondLargest($array){
    for($i=0; $i<count($array); $i++){
        for($j=0; $j<count($array)-1; $j++){
            if($array[$j] > $array[$j+1]){
            $temp = $array[$j+1];
            $array[$j+1] = $array[$j];
            $array[$j] = $temp;
            }
        }
    }
  return $array[sizeof($array)-2];
}

$arr = [-1, 8, 4, 2, 8];
print_r(secondLargest($arr));
?>

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

不使用 MAX function。在這里。

$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;

此代碼將重復值視為一個,即“43”出現兩次,但下一個值是“24”。

$ar = [2, 3, 24, 5, 4, 5, 43, 43, 23];
$max = null;
$maxNext = null; 

foreach ($ar as $value) {
    if ($max === null || $value > $max) {
        $maxNext = $max;
        $max = $value;
    }
}

var_dump($max, $maxNext); // 43, 24

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM