## 思考:
> 其實關鍵節點就在于在序列中找到值等于待查找元素值時的處理。如果此時 $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);
}
}
~~~
- PHP操作集合
- 獲取字符首字母
- PHP實現定時備份MySQL數據庫
- PHP定時發送郵件
- PHP基本語法
- 總結
- 命名空間
- 錯誤抑制符
- 位運算符
- 原碼,反碼,補碼
- traits
- PHP的反射機制
- const和define的區別
- 語法
- 常用的函數
- 1.變量及打印函數
- 2.引入文件
- 3.常量
- 4.錯誤處理
- 5.面向對象
- 數據結構與算法
- 結構
- 數組
- 索引
- 散列表(哈希表)
- 棧
- 隊列
- 鏈表
- 算法
- 排序算法
- 插入排序
- 冒泡排序
- 選擇排序
- 歸并排序
- 快速排序
- 查找算法
- 二分查找
- 二分查找變形版本1:查詢數據在序列中第一次出現
- 哈希算法
- 算法復雜度
- Smarty模板引擎
- composer
- yaf
- yaf的安裝配置
- 其它
- Java
- JavaSE
- 1.Java發展及JDK安裝配置
- 2.Eclipse的下載及安裝
- 3.Java開發基礎
- 虛擬機
- 2.編輯虛擬機設置
- 1.虛擬機下安裝centos
- 3.安裝vmtools
- Linux
- 1.vi和vim編輯器
- 2.開機、重啟和用戶登錄注銷
- 3.用戶管理
- 4.用戶組管理
- 5.用戶和組的相關文件
- 6.linux運行級別
- 7.幫助指令
- 8.文件目錄類指令
- 9.時間日期類
- 10.搜索查找類
- 11.壓縮和解壓縮
- 12.組管理和權限管理(難點,重點)
- 虛擬主機的配置
- phpstudy快捷配置
- 配置文件配置
- PHP面向對象高級特性
- SPL標準庫(PHP標準庫)
- PHP鏈式操作的實現
- 面向對象編程的基本原則
- 設計模式
- 基本的設計模式