題目描述請實現有重複數字的有序陣列的二分查詢。
輸出在陣列中第乙個大於等於查詢值的位置,如果陣列中不存在這樣的數,則輸出陣列長度加一。
輸入 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的中間數 重複這個過程來縮小猜測的範圍,直到猜出正確的數字。二分查詢的工作方法類似於此。二...