算法:在数组中找出所有这样的数,它比它前面的数都大,比它后面的数都小

Posted cfyu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法:在数组中找出所有这样的数,它比它前面的数都大,比它后面的数都小相关的知识,希望对你有一定的参考价值。

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 指向最后一个元素,则原数组中所有元素均不满足,return;

2、如果MinIndex 指向第一个元素,则第一个元素满足要求,输出。

3、如果MinIndex 指向中间的某个元素,则对后半部分,递归进行上面的过程。

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

以上是关于算法:在数组中找出所有这样的数,它比它前面的数都大,比它后面的数都小的主要内容,如果未能解决你的问题,请参考以下文章

内部排序之快速排序

快速排序 非库函数(转)

算法分析 - 快速排序QUICK-SORT

python 快速排序

Python排序算法之快速排序

数组中的逆序对-剑指Offer