題目:給定一個 n 個元素有序的(升序)整型陣列 nums 和一個目標值 target ,寫一個函式搜尋 nums 中的 target,如果目標值存在返回下標,否則返回 -1。
示例1:
輸入: nums = [-1,0,3,5,9,12], target = 9
輸出: 4
解釋: 9 出現在 nums 中並且下標為 4示例2:
輸入: nums = [-1,0,3,5,9,12], target = 2
輸出: -1
解釋: 2 不存在 nums 中因此返回 -1
解法一:非遞迴二分查詢
思路分析:
折半查詢,通過遍歷,一分為二,兩邊比較,不斷往中間移動,直到中間值等於目標值為止
PHP程式碼實現:
/**
* @param Integer[] $nums
* @param Integer $target
* @return Integer
*/
function search($nums, $target) {
$left = 0;//左邊從第一個元素開始
$right = count($nums)-1;//右邊從最後一個元素開始
while($left <= $right){
$mid = intval(($left + $right) / 2);//以中間點做參照點比較
if($nums[$mid] == $target){//中間點值與目標相等,則找到返回
return $mid;
}elseif($nums[$mid] < $target){//查詢目標值比參照點大,捨去右邊
$left = $mid + 1;
}elseif($nums[$mid] > $target){//查詢目標值比參照點小,捨去左邊
$right = $mid - 1;
}
}
return -1;
}
使用:
$nums = [1,2,3,6,9];
$target = 1;
echo search($nums,$target);
複雜度分析:
時間複雜度:O(logn)
每次可以捨去一半的查詢區間
空間複雜度:O(1)
由於輔助空間是常數級別
解法二:遞迴二分查詢
思路分析:
遞迴思想實現折半查詢,通過遍歷,一分為二,兩邊比較,不斷往中間移動,直到中間值等於目標值為止
PHP程式碼實現:
/**
* @param Integer[] $nums
* @param Integer $target
* @param Integer $left
* @param Integer $right
* @return Integer
*/
function search($nums, $target, $left, $right) {
$mid = intval (($left + $right)/2);//以中間點做參照點比較
if($left > $right){
return -1;
}
if($nums[$mid] == $target){//中間點值與目標相等,則找到返回
return $mid;
}elseif($nums[$mid] < $target){//查詢目標值比參照點小,捨去左邊,並進行遞迴
return search($nums, $target, $mid+1, $right);
}elseif($nums[$mid] > $target){//查詢目標值比參照點大,捨去右邊,並進行遞迴
return search($nums, $target, $left, $mid-1);
}
return -1;
}
使用:
$nums = [1,2,3,6,9];
$target = 6;
echo search($nums,$target,0,count($nums)-1);
複雜度分析:
時間複雜度:O(logn)
每次可以捨去一半的查詢區間
空間複雜度:O(logn)
二分查詢定義:
二分查詢也稱折半查詢(Binary Search),它是一種效率較高的查詢方法。
但是,折半查詢要求線性表必須採用順序儲存結構,而且表中元素按關鍵字有序排列。
github
以後每次題解都會上傳到這個專案
題目來源
力扣(LeetCode):https://leetcode-cn.com/problems/binary-se...
本作品採用《CC 協議》,轉載必須註明作者和本文連結