二分查詢(JS解法)——高頻面試演算法題(百度真題)

進擊的碼農菌發表於2020-11-11

題目描述:

請實現有重複數字的有序陣列的二分查詢。
輸出在陣列中第一個大於等於查詢值的位置,如果陣列中不存在這樣的數,則輸出陣列長度加一。

示例:
輸入
5,4,[1,2,4,4,5]

返回值
3

說明
輸出位置從1開始計算

我個人解法

/**
 * 二分查詢
 * @param n int整型 陣列長度
 * @param v int整型 查詢值
 * @param a int整型一維陣列 有序陣列
 * @return int整型
 */
function upper_bound_( n ,  v ,  a ) {
    // write code here
    if(a[n-1] < v) {
        return n+1;
    }
    var left = 0,right = n-1;
    while(left < right) {
        var mid = parseInt((left+right)/2);
        if(v > a[mid]) {
            left = mid+1;
        } else {
            right = mid;
        } 
    }
    return right+1;
}

解題思路:

  1. 用陣列最大數去判斷查詢值存不存在,若不存在的話直接按題目要求返回陣列長度+1。
  2. 然後就是按標準的二分查詢法去找查詢值。
  3. 這裡有一個值得注意的點是,題目要求返回的是第一個大於或者等於查詢值的位置,那麼我們只需要定位到大值為查詢值即可。返回這個值的位置,記得加一。

相關文章