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)的空間復雜度
