問題說明
給你乙個公升序整數陣列nums,和乙個目標值target,請返回它在nums陣列中的左邊界索引和右邊界索引
例如:nums=,target=3,那麼就應該返回左邊界索引2和右邊界索引4
問題分析
我們先看如果是平常我們熟悉的二分查詢法,找到乙個值就返回它的索引,這種**是這樣的
它找到target=3直接返回public
intbinarysearch
(int
nums,
int target)
return-1
;}
我們知道這樣的二分查詢它的結束條件為
要麼找到target的值,要麼nums陣列中不存在target的值這時候right索引將會小於left索引左邊造成迴圈退出查詢失敗1. nums[mid]==target
2. right < left
找左邊界怎麼做?
我們知道要尋找邊界位置,那麼意味著在找到nums[mid]==target後,不能直接返回mid索引。
那麼不返回mid的值就是意味著我們需要繼續尋找,這其實等價於target不在nums陣列中存在,我們最後一定會尋找失敗退出迴圈我們就利用退出迴圈後的right索引和left索引來確定邊界位置。我們知道查詢失敗後right索引小於left索引,值就相差1。
二分查詢會不斷縮小查詢區域,當target不存在時,它最後一次查詢的區域就一定是target值的相鄰值。
如上圖所示,尋找target=0時,最後一次查詢的區域為nums[left]=nums[right]=1,1是陣列中最接近target的相鄰值,二分查詢失敗總會在最後一次查詢位置時來到這裡,隨後發現nums[mid]!=target,right左移,迴圈退出。
那麼再來看尋找左邊界時
}
右邊界索引與此類似,right的位置就是右邊界值
左右邊界二分查詢
二分查詢雖然是個基礎演算法,但是要考慮的還是蠻多的 二分的前提是避免死迴圈,所以邊界迭代的時候不能出現重複的值,由於整數型別的除法是向下取整,所以當left right 1的是時候就會造成mid left如果邊界迭代是left mid的話 就會陷入死迴圈,所以邊界迭代最好寫成下面的形式,再根據不同的...
順序查詢 二分查詢 索引查詢
1.查詢技術的分類。如下圖 2.什麼是順序查詢呢?無序表 順序查詢的原理很簡單,就是遍歷整個列表,逐個進行記錄的關鍵字與給定值比較,若某個記錄的關鍵字和給定值相等,則查詢成功,找到所查的記錄。如果直到最後乙個記錄,其關鍵字和給定值比較都不等時,則表中沒有所查的記錄,查詢失敗。時間複雜度是o n 3....
二分查詢目標元素索引
package com.zhangry.search public class binarysearch int start 0 int end arrayforsearch.length 1 int target 3 system.out.println target 在此陣列中的索引為 bina...