LeetCode -- 704. 二分查找 -- 搜索區(qū)間的確定

題目鏈接
給定一個 n 個元素有序的(升序)整型數(shù)組 nums 和一個目標(biāo)值 target ,寫一個函數(shù)搜索 nums 中的 target卤妒,如果目標(biāo)值存在返回下標(biāo)甥绿,否則返回 -1字币。

示例 1:

輸入: nums = [-1,0,3,5,9,12], target = 9
輸出: 4
解釋: 9 出現(xiàn)在 nums 中并且下標(biāo)為 4
示例 2:

輸入: nums = [-1,0,3,5,9,12], target = 2
輸出: -1
解釋: 2 不存在 nums 中因此返回 -1

提示:

你可以假設(shè) nums 中的所有元素是不重復(fù)的。
n 將在 [1, 10000]之間共缕。
nums 的每個元素都將在 [-9999, 9999]之間洗出。

其實二分查找的思想比較容易理解,但是問題就在于搜索區(qū)間的開閉骄呼。如果不能明白每次搜索區(qū)間的首尾的開閉情況就會出現(xiàn)不能正確查詢出結(jié)果的問題共苛。下面兩個解法都能通過。

// 解法一
class Solution {
public:
    int search(vector<int>& nums, int target) {
        int begin = 0, end = nums.size() ;

         while( begin < end ){
            int middle = (begin + end ) / 2;
        // 奇偶之分蜓萄,導(dǎo)致中間位置有偏差
            if(nums[middle] == target){
                return middle;
            }else if( nums[middle] > target){
                end = middle;
            }else{
                begin = middle + 1;
            }

        }
        return -1;
        
    }
    
};
// 解法二
class Solution {
public:
    int search(vector<int>& nums, int target) {
        
        int left, right;
        left = 0, right = nums.size() - 1;
        
        while( left <= right ){
           int mid = (left + right) / 2;

            if( nums[mid] > target ) right = mid-1;
            else if( nums[mid] < target) left = mid+1;
            else 
                return mid;
            
        }
        return -1;
        
    }
};

對于解法一:

我們將搜索區(qū)間定在了[ 0, nums.size() )隅茎, 顯然我們在程序中是不能夠訪問 nums[ nums.size() ] 這個元素的,因為這樣會導(dǎo)致邊界溢出嫉沽。在這個搜索區(qū)間下辟犀,我們的 middle = (left + right ) / 2 是正好指向整個搜索區(qū)間的中間元素的(元素個數(shù)為奇數(shù)個時正好指向中間位置,偶數(shù)個時則位于中間偏右位置)绸硕。

為了保持搜索區(qū)間的狀態(tài)一致性堂竟,我們在后續(xù)進行二分的時候?qū)?yīng)的區(qū)間也應(yīng)當(dāng)都是左開右閉的搜索狀態(tài),這里具體下來就是:對于第一次遍歷的右頂點是屬于越界情況玻佩,后續(xù)的搜索過程中出嘹,右頂點都是屬于已遍歷過無需再次遍歷的狀態(tài)。所以每次的二分區(qū)間為 [left, middle), [middle +1, right)咬崔。

假設(shè)當(dāng)搜索區(qū)間中不存在目標(biāo)元素時税稼,搜索區(qū)間不斷向兩端收縮,最終到達 left == left或者 right == right 此時的搜索區(qū)間都是[left, left), [right, right) 的 狀態(tài)垮斯,實際上這樣的搜索區(qū)間都是空的郎仆,不可搜索的區(qū)間,因此這作為程序的終止條件兜蠕。

同理對于解法二:

這個解法是將整個搜索區(qū)間定在了[0, nums.size() -1], 這樣一來我們需要對整個搜索區(qū)間進行遍歷扰肌,在這個搜索區(qū)間下,我們的 middle = (left + right ) / 2 是正好指向整個搜索區(qū)間的中間元素的(元素個數(shù)為奇數(shù)個時正好指向中間位置熊杨,偶數(shù)個時則位于中間偏左位置)

同上思路曙旭,我們進行二分劃分搜索區(qū)間時,兩邊的頂點都應(yīng)該時保持左開右開的狀態(tài)晶府,即[left, middle-1], [middle+1, right ]桂躏。

同樣,在這個區(qū)間下最終的兩端狀態(tài)會變成[left, left],[right, right], 因為是都是開區(qū)間郊霎,所以這樣的區(qū)間還有一個元素需要遍歷沼头,因此我們程序的結(jié)束條件為 left > right 。


綜上, 在使用二分搜索進行查找元素時一定要保持最初的搜索空間和對應(yīng)的子搜索空間是保持一致的搜索狀態(tài)进倍,這樣才能正確對元素進行遍歷檢索土至。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市猾昆,隨后出現(xiàn)的幾起案子陶因,更是在濱河造成了極大的恐慌,老刑警劉巖垂蜗,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件楷扬,死亡現(xiàn)場離奇詭異,居然都是意外死亡贴见,警方通過查閱死者的電腦和手機烘苹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來片部,“玉大人镣衡,你說我怎么就攤上這事〉涤疲” “怎么了廊鸥?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長辖所。 經(jīng)常有香客問我惰说,道長,這世上最難降的妖魔是什么缘回? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任吆视,我火速辦了婚禮,結(jié)果婚禮上切诀,老公的妹妹穿的比我還像新娘揩环。我一直安慰自己搔弄,他們只是感情好幅虑,可當(dāng)我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著顾犹,像睡著了一般倒庵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上炫刷,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天擎宝,我揣著相機與錄音,去河邊找鬼浑玛。 笑死绍申,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播极阅,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼胃碾,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了筋搏?” 一聲冷哼從身側(cè)響起仆百,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎奔脐,沒想到半個月后俄周,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡髓迎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年峦朗,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片排龄。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡甚垦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出涣雕,到底是詐尸還是另有隱情艰亮,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布挣郭,位于F島的核電站迄埃,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏兑障。R本人自食惡果不足惜侄非,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望流译。 院中可真熱鬧逞怨,春花似錦、人聲如沸福澡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽革砸。三九已至除秀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間算利,已是汗流浹背册踩。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留效拭,地道東北人暂吉。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓胖秒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親慕的。 傳聞我的和親對象是個殘疾皇子扒怖,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容