算法:在数组中找出所有这样的数,它比它前面的数都大,比它后面的数都小
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 前面一部分的最大值。
以上是关于算法:在数组中找出所有这样的数,它比它前面的数都大,比它后面的数都小的主要内容,如果未能解决你的问题,请参考以下文章