每日一道演算法:二分查詢

zhangdeTalk發表於2020-01-17

題目:給定一個 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_PHP:https://github.com/zhangdejian/LeetCode_PHP

題目來源

力扣(LeetCode):https://leetcode-cn.com/problems/binary-se...

本作品採用《CC 協議》,轉載必須註明作者和本文連結

阿德

相關文章