二分查詢邊界索引

2021-10-03 19:10:11 字數 1644 閱讀 2622

問題說明

給你乙個公升序整數陣列nums,和乙個目標值target,請返回它在nums陣列中的左邊界索引和右邊界索引

例如:nums=,target=3,那麼就應該返回左邊界索引2和右邊界索引4

問題分析

我們先看如果是平常我們熟悉的二分查詢法,找到乙個值就返回它的索引,這種**是這樣的

public

intbinarysearch

(int

nums,

int target)

return-1

;}

它找到target=3直接返回

我們知道這樣的二分查詢它的結束條件為

1. nums[mid]==target

2. right < left

要麼找到target的值,要麼nums陣列中不存在target的值這時候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...