leetcode-33 搜索旋轉(zhuǎn)排序數(shù)組

假設(shè)按照升序排序的數(shù)組在預(yù)先未知的某個(gè)點(diǎn)上進(jìn)行了旋轉(zhuǎn)蝗砾。

( 例如拯坟,數(shù)組 [0,1,2,4,5,6,7] 可能變?yōu)?[4,5,6,7,0,1,2] )。

搜索一個(gè)給定的目標(biāo)值夕膀,如果數(shù)組中存在這個(gè)目標(biāo)值果善,則返回它的索引诊笤,否則返回 -1 。

你可以假設(shè)數(shù)組中不存在重復(fù)的元素巾陕。

你的算法時(shí)間復(fù)雜度必須是 O(log n) 級別讨跟。

示例 1:

輸入: nums = [4,5,6,7,0,1,2], target = 0
輸出: 4

示例 2:

輸入: nums = [4,5,6,7,0,1,2], target = 3
輸出: -1

分析:看到對復(fù)雜度的要求纪他,首先想到二分法,經(jīng)過旋轉(zhuǎn)的序列晾匠,因此與我們之前所想到的二分法應(yīng)該要有一些差異茶袒。分析數(shù)字特征明顯看出,整個(gè)數(shù)據(jù)變成兩個(gè)部分凉馆,前邊是較大的數(shù)薪寓,從小到大,后邊是較小的數(shù)澜共,從大到小排列向叉,找出中間點(diǎn)處于那一段,跟每一段的端點(diǎn)比較嗦董。

  1. 首先找到中間點(diǎn)位置i = (min+max)//2
  2. 判斷中間點(diǎn)值與target 大小
    3a.如果中間點(diǎn)值比target小
    判斷中間點(diǎn)處于大段還是小段母谎,如果中間點(diǎn)值小于數(shù)組中最后一個(gè)數(shù),則中間點(diǎn)處于大段京革,此時(shí)小段最大數(shù)位于數(shù)組最后一個(gè)數(shù)奇唤,若小段最后一個(gè)數(shù)仍舊比target小,則丟棄小段數(shù)據(jù)匹摇,更新 max = i-1咬扇,相反情況則是丟棄大段數(shù)據(jù)更新min = i+1
    3b.如果中間點(diǎn)值比target大
    判斷中間點(diǎn)處于大段還是小段,如果中間點(diǎn)值大于數(shù)組中最后一個(gè)數(shù)廊勃,則中b間點(diǎn)處于大段冗栗,此時(shí)大段第一個(gè)數(shù)最小,若大段第一個(gè)數(shù)仍舊比目標(biāo)小供搀,丟棄大段數(shù)據(jù),更新 min= i+1钠至,否則葛虐,max=i-1
def search(nums: List[int], target: int) -> int:
        imin,imax = 0,len(nums)-1
        while imin <= imax:
            i = (imin+imax)//2
            if nums[i]<target:#判斷i在小段還是大段
                if nums[i] < nums[-1] and nums[-1]<target:
                    imax = i-1
                else:
                    imin = i+1
            
            elif nums[i] > target:
                if nums[i]>nums[-1] and nums[0]>target:
                    imin = i+1
                else:
                    imax = i-1
            else:
                return i
        return -1
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市棉钧,隨后出現(xiàn)的幾起案子屿脐,更是在濱河造成了極大的恐慌,老刑警劉巖宪卿,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件的诵,死亡現(xiàn)場離奇詭異,居然都是意外死亡佑钾,警方通過查閱死者的電腦和手機(jī)西疤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來休溶,“玉大人代赁,你說我怎么就攤上這事扰她。” “怎么了芭碍?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵徒役,是天一觀的道長。 經(jīng)常有香客問我窖壕,道長忧勿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任瞻讽,我火速辦了婚禮鸳吸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘卸夕。我一直安慰自己层释,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布快集。 她就那樣靜靜地躺著贡羔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪个初。 梳的紋絲不亂的頭發(fā)上乖寒,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天,我揣著相機(jī)與錄音院溺,去河邊找鬼楣嘁。 笑死,一個(gè)胖子當(dāng)著我的面吹牛珍逸,可吹牛的內(nèi)容都是我干的逐虚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼谆膳,長吁一口氣:“原來是場噩夢啊……” “哼叭爱!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起漱病,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤买雾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后杨帽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體漓穿,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年注盈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了晃危。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,488評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡老客,死狀恐怖山害,靈堂內(nèi)的尸體忽然破棺而出纠俭,到底是詐尸還是另有隱情,我是刑警寧澤浪慌,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布冤荆,位于F島的核電站,受9級特大地震影響权纤,放射性物質(zhì)發(fā)生泄漏钓简。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一汹想、第九天 我趴在偏房一處隱蔽的房頂上張望外邓。 院中可真熱鬧,春花似錦古掏、人聲如沸损话。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽丧枪。三九已至,卻和暖如春庞萍,著一層夾襖步出監(jiān)牢的瞬間拧烦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工钝计, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留恋博,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓私恬,卻偏偏與公主長得像债沮,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子本鸣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評論 2 359