34. Find First and Last Position of Element in Sorted Array

這道題考察二分法的細(xì)節(jié)忙芒。
其實(shí)如果不是對(duì)二分法很熟凰棉,挺容易出小錯(cuò)誤的膀哲,寫(xiě)不干凈往产。
主要考察二分法的邊界條件,退出規(guī)則某宪。
首先 先找First position.
當(dāng)中間的數(shù)大于等于target時(shí)仿村,把右邊界移到m.
否則把左邊界移到m + 1;
退出條件是只剩一個(gè)數(shù)。如果這個(gè)數(shù)是target, 則把l這個(gè)位置記下來(lái)兴喂,否則記 -1蔼囊;
然后找last position.
當(dāng)中間的數(shù)小于等于target時(shí),把左邊界移到m
否則把右邊界移到m - 1;

但是你看代碼里面衣迷,求m的方式在兩個(gè)while loop里是略不一樣的畏鼓。
一個(gè)是 int m = l + (r - l) / 2;
一個(gè)是 int m = r - (r - l) / 2;
這兩句話的區(qū)別是在只剩兩個(gè)數(shù)的時(shí)候,第一個(gè)取左邊那個(gè)蘑险,第二個(gè)是取的右邊那個(gè)滴肿。
對(duì)于第一個(gè)循環(huán),當(dāng)只剩兩個(gè)數(shù)a, b的時(shí)候佃迄,取了左邊的那一個(gè)數(shù)a作為m泼差,然后下一步是要么r = m , 要么l = m + 1, 都是只剩了一個(gè)數(shù)。這時(shí)如果取右邊的那個(gè)數(shù)的話呵俏,r就stuck在m上了堆缘,無(wú)法退出循環(huán)。

對(duì)第二個(gè)循環(huán)普碎,當(dāng)只剩兩個(gè)數(shù)a, b時(shí)吼肥,取了右邊的那個(gè)數(shù)b作為m. 下一步要么是 l =m 要么是r = m - 1, 也是只剩下了一個(gè)數(shù),可以退出循環(huán)。這時(shí)如果和第一個(gè)循環(huán)一樣取左邊的那個(gè)數(shù)a缀皱,l就stuck在了a (就是m)上了斗这。

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        vector<int> ans{-1, -1};
        if (nums.size() < 1)  return ans;

        int l = 0, r = nums.size() - 1;
        
        while (l < r) {
            int m = l + (r - l) / 2;
            if (nums[m] >= target) r = m; 
            else l = m + 1;
        }
        
        if (nums[l] == target)  ans[0] = l;
        else return ans;
        
        l = 0;
        r = nums.size() - 1;
        while (l < r) {
            int m = r - (r - l) / 2;
            if (nums[m] <= target) l = m;
            else r = m - 1;
        }
        if (nums[l] == target) ans[1] = r;
        return ans;
    }
};

其實(shí)這個(gè)判斷條件還可以寫(xiě)的更細(xì)一點(diǎn)璧微,分三種
如果 nums[m] =, >, < 各寫(xiě)一個(gè)殖侵。但其實(shí)沒(méi)多少必要夫啊。
我也寫(xiě)了一個(gè)這種情況下的code灭衷,帖在下面。

class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        vector<int> ans{-1, -1};
        if (nums.size() < 1)  return ans;

        int l = 0, r = nums.size() - 1;
        
        while (l < r) {
            int m = l + (r - l) / 2;
            if (nums[m] == target) r = m; 
            else if (nums[m] < target) l = m + 1;
            else r = m - 1;
        }
        
        if (nums[l] == target)  ans[0] = l;
        else return ans;
        
        l = 0;
        r = nums.size() - 1;
        while (l < r) {
            int m = r - (r - l) / 2;
            if (nums[m] == target) l = m;
            else if (nums[m] < target) l = m + 1;
            else r = m - 1;
        }
        if (nums[r] == target) ans[1] = r;
        return ans;
    }
};
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末忿磅,一起剝皮案震驚了整個(gè)濱河市罐农,隨后出現(xiàn)的幾起案子汗侵,更是在濱河造成了極大的恐慌崔拥,老刑警劉巖极舔,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異链瓦,居然都是意外死亡拆魏,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)澡绩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)稽揭,“玉大人俺附,你說(shuō)我怎么就攤上這事肥卡。” “怎么了事镣?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵步鉴,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我璃哟,道長(zhǎng)氛琢,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任随闪,我火速辦了婚禮阳似,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘铐伴。我一直安慰自己撮奏,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布当宴。 她就那樣靜靜地躺著畜吊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪户矢。 梳的紋絲不亂的頭發(fā)上玲献,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼捌年。 笑死瓢娜,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的礼预。 我是一名探鬼主播恋腕,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼逆瑞!你這毒婦竟也來(lái)了荠藤?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤获高,失蹤者是張志新(化名)和其女友劉穎哈肖,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體念秧,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡淤井,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了摊趾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片币狠。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖砾层,靈堂內(nèi)的尸體忽然破棺而出漩绵,到底是詐尸還是另有隱情,我是刑警寧澤肛炮,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布止吐,位于F島的核電站,受9級(jí)特大地震影響侨糟,放射性物質(zhì)發(fā)生泄漏碍扔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一秕重、第九天 我趴在偏房一處隱蔽的房頂上張望不同。 院中可真熱鬧,春花似錦溶耘、人聲如沸二拐。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)卓鹿。三九已至,卻和暖如春留荔,著一層夾襖步出監(jiān)牢的瞬間吟孙,已是汗流浹背澜倦。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留杰妓,地道東北人藻治。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像巷挥,于是被迫代替她去往敵國(guó)和親桩卵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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