码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2020-02-28 12:28:22      阅读:314      评论:0      收藏:0      [点我收藏+]

标签:bsp   复杂   item   code   查找表   遍历   pre   查找   dex   

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 前面一部分的最大值。

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

标签:bsp   复杂   item   code   查找表   遍历   pre   查找   dex   

原文地址:https://www.cnblogs.com/cfYu/p/12376182.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!