旋轉(zhuǎn)數(shù)組中的元素查找

一孽尽、旋轉(zhuǎn)數(shù)組中的最小數(shù)字

題目:把一個(gè)數(shù)組最開(kāi)始的若干個(gè)元素搬到數(shù)組的末尾田巴,我們稱(chēng)之為數(shù)組的旋轉(zhuǎn)麸折。輸入一個(gè)遞增排序的數(shù)組的旋轉(zhuǎn)锡凝,輸出旋轉(zhuǎn)數(shù)組的最小元素。例如磕谅,數(shù)組 [3,4,5,1,2] 為 [1,2,3,4,5] 的一個(gè)旋轉(zhuǎn)私爷,該數(shù)組的最小元素為1雾棺。

解法一:順序查找,復(fù)雜度O(n)
var search = function(nums){
    var min = nums[0];
    for(var i=1;i<nums.length;i++){
        if(nums[i]<=min){
            min = nums[i];
        }
    }
    return min;
}
解法二:二分查找衬浑,復(fù)雜度O(logn)
var search = function(nums){
    var left = 0,
    right = nums.length-1,
    mid = 0;
    while(right-left > 1 && nums[right] <= nums[left]){
         mid = parseInt((left+right)/2);
         // 左區(qū)間是遞增序列捌浩,最小元素在右區(qū)間
         if(nums[left]<=nums[mid]){
             left = mid;
         }
         // 右區(qū)間是遞增序列,最小元素在左區(qū)間
         if(nums[mid]<=nums[right]){
             right = mid;
         }
     }
    return nums[right];
}

二工秩、搜索旋轉(zhuǎn)數(shù)組中的元素

題目:在旋轉(zhuǎn)數(shù)組中搜索一個(gè)給定的目標(biāo)值尸饺,如果數(shù)組中存在這個(gè)目標(biāo)值,則返回它的索引助币,否則返回 -1 浪听。假定數(shù)組中沒(méi)有重復(fù)元素。

思路:二分查找眉菱,復(fù)雜度O(logn)

參考https://leetcode-cn.com/problems/search-in-rotated-sorted-array/solution/ji-bai-liao-9983de-javayong-hu-by-reedfan/

取區(qū)間的中間值mid后:

  1. 如果nums[mid] == target迹栓,直接返回mid值;
  2. 如果nums[mid] >= nums[left]俭缓,說(shuō)明左半?yún)^(qū)間是遞增序列克伊;如果target落在左半?yún)^(qū)間,則在左半?yún)^(qū)間內(nèi)搜索华坦,否則在右半?yún)^(qū)間內(nèi)搜索
  3. 如果nums[mid] <= nums[left]愿吹,說(shuō)明右半?yún)^(qū)間是遞增序列;如果target落在右半?yún)^(qū)間惜姐,則在右半?yún)^(qū)間內(nèi)搜索犁跪,否則在左半?yún)^(qū)間內(nèi)搜索
var search = function(nums,target){
    var left = 0,
        right = nums.length-1,
        mid = 0;
    if(nums.length == 0) return -1;
    while(right >= left){
        mid = parseInt((left+right)/2);
        if(nums[mid] == target) return mid;
        // 左半?yún)^(qū)間是遞增序列
        if(nums[left] <= nums[mid]){
            if(nums[left] <= target && target < nums[mid]){
                right = mid-1;
            }else{
                left = mid+1;
            }
        }else{ //右半?yún)^(qū)間是遞增序列
            if(nums[mid] < target && target <= nums[right]){
                left = mid+1;
            }else{
                right = mid-1;
            }
        }
    }
    return -1;
}

三、搜索旋轉(zhuǎn)數(shù)組中的元素

題目:在旋轉(zhuǎn)數(shù)組中搜索一個(gè)給定的目標(biāo)值歹袁,如果數(shù)組中存在這個(gè)目標(biāo)值坷衍,則返回true,否則返回false宇攻。數(shù)組中可能存在重復(fù)元素惫叛。

思路:二分查找,復(fù)雜度O(logn)

思路基本同上題逞刷,只是要考慮到[1,0,1,1,1] 和 [1,1,1,0,1]的情況:

  1. 如果nums[mid] == target,直接返回mid值妻熊;
  2. 如果nums[left] == nums[mid]夸浅,無(wú)法判斷遞增區(qū)間的位置,則需要將left++扔役,去掉干擾元素帆喇;
  3. 如果nums[mid] >= nums[left],說(shuō)明左半?yún)^(qū)間是遞增序列亿胸;如果target落在左半?yún)^(qū)間坯钦,則在左半?yún)^(qū)間內(nèi)搜索预皇,否則在右半?yún)^(qū)間內(nèi)搜索
  4. 如果nums[mid] <= nums[left],說(shuō)明右半?yún)^(qū)間是遞增序列婉刀;如果target落在右半?yún)^(qū)間吟温,則在右半?yún)^(qū)間內(nèi)搜索,否則在左半?yún)^(qū)間內(nèi)搜索
var search = function(nums, target) {
    var left = 0,
    right = nums.length-1,
    mid = 0;
    if(nums.length == 0) return false;
    while(right >= left){
        mid = parseInt((left+right)/2);
        if(nums[mid] == target) return true;
        // 去掉重復(fù)項(xiàng)的干擾
        if(nums[left] == nums[mid]){
            left++;
            continue;
        }

        if(nums[left] <= nums[mid]){
            if(nums[left] <= target && target < nums[mid]){
                right = mid-1;
            }else{
                left = mid+1;
            }
        }else{
            if(nums[mid] < target && target <= nums[right]){
                left = mid+1;
            }else{
                right = mid-1;
            }
        }
    }
    return false;
};
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末突颊,一起剝皮案震驚了整個(gè)濱河市鲁豪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌律秃,老刑警劉巖爬橡,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異棒动,居然都是意外死亡糙申,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)船惨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)柜裸,“玉大人,你說(shuō)我怎么就攤上這事掷漱≌呈遥” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵卜范,是天一觀的道長(zhǎng)衔统。 經(jīng)常有香客問(wèn)我,道長(zhǎng)海雪,這世上最難降的妖魔是什么锦爵? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮奥裸,結(jié)果婚禮上险掀,老公的妹妹穿的比我還像新娘。我一直安慰自己湾宙,他們只是感情好樟氢,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著侠鳄,像睡著了一般埠啃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上伟恶,一...
    開(kāi)封第一講書(shū)人閱讀 52,158評(píng)論 1 308
  • 那天碴开,我揣著相機(jī)與錄音,去河邊找鬼。 笑死潦牛,一個(gè)胖子當(dāng)著我的面吹牛眶掌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播巴碗,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼朴爬,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了良价?” 一聲冷哼從身側(cè)響起寝殴,我...
    開(kāi)封第一講書(shū)人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎明垢,沒(méi)想到半個(gè)月后蚣常,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡痊银,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年抵蚊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片溯革。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡贞绳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出致稀,到底是詐尸還是另有隱情冈闭,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布抖单,位于F島的核電站萎攒,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏矛绘。R本人自食惡果不足惜耍休,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望货矮。 院中可真熱鬧羊精,春花似錦、人聲如沸囚玫。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)抓督。三九已至裸违,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間本昏,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工枪汪, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留涌穆,地道東北人怔昨。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像宿稀,于是被迫代替她去往敵國(guó)和親趁舀。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

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

  • 原文鏈接: 點(diǎn)這里更多內(nèi)容就在我的個(gè)人博客 BlackBlog.tech 歡迎關(guān)注祝沸!謝謝大家矮烹! 本文源自LeetC...
    BlackBlog__閱讀 3,265評(píng)論 2 13
  • 前言 二分查找作為程序員的一項(xiàng)基本技能,是面試官最常使用來(lái)考察程序員基本素質(zhì)的算法之一罩锐,也是解決很多查找類(lèi)題目的常...
    Jesse1995閱讀 2,206評(píng)論 0 0
  • Knuth 大佬(發(fā)明 KMP 算法的那位)曾說(shuō): Although the basic idea of bina...
    盼旺閱讀 2,308評(píng)論 0 2
  • 一維數(shù)組 首先開(kāi)始最基本的Binary Search, 數(shù)組是有序的奉狈,但是有重復(fù)數(shù)。例題: Search for ...
    dol_re_mi閱讀 2,411評(píng)論 0 2
  • 簡(jiǎn)介 二分查找(Binary Search)算法涩惑,也叫折半查找算法仁期。在給順序表結(jié)構(gòu)中(也就是數(shù)組)快速查找某一個(gè)值...
    mah93閱讀 579評(píng)論 0 0