變異二分查詢解題過程

2021-10-13 12:33:55 字數 1897 閱讀 5898

題目描述

請實現有重複數字的有序陣列的二分查詢。

輸出在陣列中第乙個大於等於查詢值的位置,如果陣列中不存在這樣的數,則輸出陣列長度加一。

輸入 5,4,[1,2,4,4,5]

返回值 3

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

看完題目就確定是二分查詢,不用過腦

/**

* 二分查詢

* @param n int整型 陣列長度

* @param v int整型 查詢值

* @param a int整型一維陣列 有序陣列

* @return int整型

*/public

intupper_bound_

(int n,

int v,

int[

] a)

else

if(a[center]

> v)

else

if(a[center]

< v)

}return n +1;

}

提交**後,提示執行超時

看到提交結果後,有點懵,再次審題,才發現,題目要求的是查詢第乙個大於等於查詢值的位置

給的示例太具有迷惑性了,在[1,2,4,4,5]中,查詢4,返回值是3

但是,如果是在[1,4,4,4,5]中,查詢4,返回值應該是2

在[4,4,4,4,5]中,查詢4,返回值應該是1

問題點在於:在有重複數字的有序陣列中查詢第乙個大於等於查詢值的位置。

滿足要求的中間值要同時符合什麼條件?

1.中間值`大於等於`目標值

2.中間值的`前乙個值`要小於目標值

以[1,4,4,4,5]為例分析

第一次查詢:查詢區域為[1,4,4,4,5]

左指標指向第乙個元素1,右指標指向最後乙個(第5個)元素5

中間指標指向第三個元素4,正好等於目標值 `符合條件1`

但是此時中間值的前乙個值(第二個元素)為4,剛好等於目標值,`不符合條件2`

二分區域`縮圈`為[1,4]

第二次查詢:查詢區域為[1,4]

左指標指向第乙個元素1,右指標指向最後乙個(第2個)元素4

中間指標指向第二個元素4,正好等於目標值,`符合條件1`

中間值的前乙個值(第乙個元素)為1,`符合條件2` 【此處需要注意的是,中間值的前乙個值可能不存在的情況】

滿足條件,返回2

在二分查詢的基礎上進行修改即可

/**

* 二分查詢

* @param n int整型 陣列長度

* @param v int整型 查詢值

* @param a int整型一維陣列 有序陣列

* @return int整型

*/public

intupper_bound_

(int n,

int v,

int[

] a)

int left =0;

int rigth = n -1;

while

(rigth >= left)

else

else

if(centervalue >= v)

else

if(centervalue < v)}}

return n +1;

}

二分查詢解題模版

常規 樸素的二分查詢 在一維陣列中查詢乙個數,有返回索引,無則返回 1 int binary search int arr,int n,int val else if arr mid val else return 1 變體1 可以總結為00001111問題,查詢滿足條件的第乙個1 int bina...

迭代二分查詢二分查詢

在寫這篇文章之前,已經寫過了幾篇關於改迭代二分查詢主題的文章,想要了解的朋友可以去翻一下之前的文章 bentley在他的著作 writing correct programs 中寫道,90 的計算機專家不能在2小時內寫出完整確正的二分搜尋演算法。難怪有人說,二分查詢道理單簡,甚至小學生都能明確。不過...

二分查詢法過程詳解

現在我們來玩乙個猜數的遊戲,假設有乙個人要我們猜0 99之間的乙個數。那麼最好的方法就是從0 99的中間數49開始猜。如果要猜的數小於49,就猜24 0 48的中間數 如果要猜的數大於49,就猜74 50 99的中間數 重複這個過程來縮小猜測的範圍,直到猜出正確的數字。二分查詢的工作方法類似於此。二...