多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
## 思考: > 其实关键节点就在于在序列中找到值等于待查找元素值时的处理。如果此时 $mid 位置已经到了序列的最左边,不能再往左了,或者序列中索引小于 $mid 的上一个元素值不等于待查找元素值,那么此时 $mid 就是第一个等于待查找元素值的位置;否则还要继续往前找。 ## 代码: ~~~ /** * 二分查找 * @param $nums * @return mixed */ function binary_search($nums,$num){//传入数组和需要查找的数据 if(count($nums) <= 1){ return 0; } return binary_search_internal($nums,$num,0,count($nums)-1); } function binary_search_internal($nums,$num,$low,$high){ if($low>$high){ return -1; } $mid = floor(($low+$high)/2); if($num>$nums[$mid]){ return binary_search_internal($nums,$num,$mid+1,$high); }elseif($num<$nums[$mid]){ return binary_search_internal($nums,$num,$low,$mid-1); }else{ //区别就在这里 开始 if($mid ==0 || $nums[$mid-1] != $num){//判断是否到了最左边,或者是左边的值不等于要查找的值,因为这是一个有序的数组 return $mid; }else{ return binary_search_internal($nums,$num,$low,$mid-1); } //区别就在这里 结束 } } $nums = [1,2,2,3,4,5,6]; $index = binary_search($nums,2); print $index; ~~~ ## 查找最后一个类似 代码不同之处: ~~~ }else{ if($mid ==count($nums)-1 || $nums[$mid+1] != $num){ return $mid; }else{ return binary_search_internal($nums,$num,$mid+1,$high); } } ~~~