算法:在數組中找出所有這樣的數,它比它前面的數都大,比它后面的數都小


Ques:在數組中找出這樣的數,它比它前面的數都大,比它后面的數都小


構造一個“查找表” Min[n];對應位置上Min[i],存放了原數組A[i]位置往后這一部分的最小值。

一個變量Max,保存了在遍歷A[n]時,遇到的最大值。

遍歷A[n],如果 A[i]>=Max (比前面的數都大),並且 A[i] <= Min[i] (比后面的數都小),輸出A[i]。

 

$arrOrigin = [21,11,45,56,9,66,77,89,78,68,100,120,111];
$ret = findItem($arrOrigin);
//print_r($ret);
function findItem($arrOrigin){
    $arrMin = []; 
    $len = count($arrOrigin);
    $intMax = $arrOrigin[0];
    $arrMin[$len-1] = $arrOrigin[$len-1];
    $ret = [];
    for($i=$len-2; $i>=0; $i--){//構造查找表
        $arrMin[$i] = $arrOrigin[$i] < $arrMin[$i+1] ? $arrOrigin[$i] : $arrMin[$i+1];
    }
    for($i=0; $i<$len; $i++){
        if($arrOrigin[$i] >= $intMax && $arrOrigin[$i] <= $arrMin[$i]){
            $ret[] = $arrOrigin[$i];
        }
        if($intMax < $arrOrigin[$i]){
            $intMax = $arrOrigin[$i];
        }
    }
    return $ret;
}


O(N)的時間復雜度和O(N)的空間復雜度

 

另一種解法:

在數組中,找到最小值的地址(指針、索引)MinIndex,則

1、如果MinIndex 指向最后一個元素,則不符合要求;

2、如果MinIndex 指向第一個元素,則第一個元素滿足要求,輸出。

3、如果MinIndex 指向中間的某個元素,則對后半部分,重復進行上面的過程。

在上述算法中,需要設置一變量Max,保存MinIndex 前面一部分的最大值。

$arrOrigin = [21,11,45,56,9,66,77,89,78,68,100,120,111];
$ret = findItem($arrOrigin);
print_r($ret);
function findMin(&$arrOrigin, $intL, $intR){
    $intLen = count($arrOrigin);
    $intMinKey = $intL;
    for($i=$intL+1; $i<=$intR; $i++){//查找最小值
        $intMinKey = $arrOrigin[$i] < $arrOrigin[$intMinKey] ? $i : $intMinKey;
    }
    return $intMinKey;
}

function findMax(&$arrOrigin, $intL, $intR){
    $intLen = count($arrOrigin);
    $intMaxKey = $intL;
    for($i=$intL+1; $i<=$intR; $i++){//查找最大值
        $intMaxKey = $arrOrigin[$i] > $arrOrigin[$intMaxKey] ? $i : $intMaxKey;
    }
    return $intMaxKey;
}

function findItem($arrOrigin){
    $ret = [];
    $intLen = count($arrOrigin);
    if($intLen == 0){
        return $ret;
    }
    $intL = 0;
    $intR = $intLen-1;
    if($intL == $intR){
        return $arrOrigin;
    }
    $intMax = PHP_INT_MIN;
    while($intL <= $intR){
        $intMinKey = findMin($arrOrigin, $intL, $intR); // 找到最小值的索引
        $intMaxKey = findMax($arrOrigin, $intL, $intMinKey); // 找到MinIndex 前面一部分的最大值
        if($arrOrigin[$intMaxKey] > $intMax){
            $intMax = $arrOrigin[$intMaxKey];
        }

if($intMinKey == $intL && $arrOrigin[$intMinKey] >= $intMax){// Index 指向第一個元素,如果它比Max大,則符合要求 $ret[] = $arrOrigin[$intMinKey]; } $intL = $intMinKey+1; } return $ret; }

O(1)的時間復雜度和O(N)的空間復雜度


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM