數(shù)組-查找

  1. leetcode 4 兩個(gè)數(shù)組找中位數(shù)
    給定兩個(gè)大小為 m 和 n 的有序數(shù)組 nums1 和 nums2。
    請(qǐng)你找出這兩個(gè)有序數(shù)組的中位數(shù)嘿般,并且要求算法的時(shí)間復(fù)雜度為 O(log(m + n))。
    你可以假設(shè) nums1 和 nums2 不會(huì)同時(shí)為空。
    示例 1:
    nums1 = [1, 3]
    nums2 = [2]
    則中位數(shù)是 2.0
    示例 2:
    nums1 = [1, 2]
    nums2 = [3, 4]
    則中位數(shù)是 (2 + 3)/2 = 2.5

第一道想寫的題就是leetcode4.這道題很有意思,當(dāng)然也有點(diǎn)難
我想先寫一個(gè)普通二分查找(不考慮一開始越界):

def binary_search(nums, k):
    l=0
    r=len(nums)
    while(l<r):
        m=(l+r)//2
        if nums[m]==k:
            return m
        elif nums[m]<k:
            l=k+1
        else:
            r=k-1

可以看出至壤,我們要寫的這道題,思路似乎差不多枢纠,也是尋找某個(gè)數(shù)像街,時(shí)間要求也是最多l(xiāng)og(m+n),這妥妥查找了。
兩個(gè)數(shù)組需要轉(zhuǎn)換為一個(gè)數(shù)組的問題镰绎,但是并不能排序脓斩,那么可以這樣想:
nums1里邊取n1個(gè),nums2里邊取n2個(gè)跟狱,如果他們拼起來的數(shù)組是升序的俭厚,且長(zhǎng)度剛好等于mid,那么這個(gè)mid就是我們要找的位置驶臊。然而對(duì)于兩個(gè)數(shù)組挪挤,似乎不太方便同時(shí)找兩個(gè)中點(diǎn),所以不如確定nums1一共要多少個(gè)关翎,剩下的mid-nums1[保留的]就是nums2所需要的扛门。如果有這樣一個(gè)數(shù)組,那么標(biāo)號(hào)第[mid-1]就是我們需要的(因?yàn)閿?shù)組從0開始)纵寝。
所以论寨,對(duì)于nums1:先確定它的lr,然后找到nums1的中點(diǎn)和nums2的中點(diǎn)爽茴,做一個(gè)比較葬凳,如果nums1[mid1]小于nums2[mid2],那么就說明nums1左側(cè)區(qū)間太小了室奏,要拋棄火焰,所以l=mid1+1,否則胧沫,就太大了昌简,所以r=mid1-1

話雖如此,但是這樣提交會(huì)錯(cuò)绒怨,因?yàn)橐紤]1.如果一個(gè)數(shù)組是空纯赎;2.兩個(gè)數(shù)組元素?cái)?shù)量和是偶數(shù);3.兩個(gè)數(shù)組元素?cái)?shù)量和是奇數(shù)。對(duì)于3南蹂,實(shí)際上不可能做到分開的兩側(cè)數(shù)量剛好犬金,如果我們讓左側(cè)多一個(gè)數(shù)的話,也就是n1+n2=len(nums1)-n1+len(nums2)-n2+1六剥,這樣n2=len(nums1+nums2+1)/2-n1晚顷,這樣,就算一開始是偶數(shù)個(gè)仗考,+1操作也不會(huì)使坐標(biāo)計(jì)算錯(cuò)誤。對(duì)于2.假設(shè)合成的數(shù)組為c词爬,那么我們需要給求出c[mid-1],c[mid]的平均值秃嗜,而分配下去,就是我們需要知道nums1[mid1-1], nums1[mid1], nums2[mid1-1], nums2[mid2]里邊兩個(gè)元素的平均值。
和簡(jiǎn)單二分法不同我們的判斷條件也會(huì)變化锅锨,這是應(yīng)該是nums1[mid1]<nums2[mid2-1]叽赊,這個(gè)-1也是如此,mid-1是我們能到達(dá)的最遠(yuǎn)寥裂,mid是不能到達(dá)的第一個(gè)蛀缝,所以條件滿足的話冯乘,這一部分就會(huì)被完整拋棄,否則塔橡,右側(cè)的變化則是:r=mid1,道理一樣霜第,因?yàn)閙id是不能到達(dá)的葛家。
最后,問題1泌类,這個(gè)不僅僅是一開始初始化的問題癞谒,也是在運(yùn)行時(shí)會(huì)碰到的問題。一個(gè)數(shù)組全被拋棄刃榨,此時(shí)mid就完全取在另一個(gè)數(shù)組弹砚。只是,如果數(shù)組長(zhǎng)度是奇數(shù)枢希,只需判斷和0的關(guān)系桌吃,而偶數(shù)時(shí),需要判斷和總長(zhǎng)度的關(guān)系晴玖。一下是代碼:

def findMedianSortedArrays(nums1, nums2):
    len_n1=len(nums1)
    len_n2=len(nums2)

    # 這一步判斷是因?yàn)闉榱耸筺ums2的長(zhǎng)度計(jì)算時(shí)不會(huì)為負(fù)
    if len_n1>len_n2:
        len_n1,len_n2=len_n2,len_n1
        nums1,nums2=nums2,nums1
    l=0
    r=len_n1
    mid=(len_n1+len_n2+1)//2
    # 以下是search的主體
    while(l<r):
        m1=(l+r)//2
        m2=mid-m1
        if nums1[m1]<nums2[m2-1]:
            l=m1+1
        else:
            r=mid

    # 使用l读存,r給mid1,mid2賦值
    m1=l  # 或者r呕屎,因?yàn)槭且粯拥?    m2=mid=m1

    if m1>0 and m2>0:
        center1=max(nums1[m1-1],nums2[m2-1])
    elif m1<=0:
        center1=nums2[m2-1]
    elif m2<=0:  # 這里應(yīng)該寫else:让簿,不過為了邏輯清晰就把條件全寫出來
        center1=nums1[m1-1]

    if (len_n1+len_n2)%2==1:
        return center1

    if m1<len_n1 and m2<len_n2:
        center2=min(nums1[m1],nums2[m2])
    elif m1>=len_n1:
        center2=nums2[m2]
    elif m2>=len_n2:
        center2=nums1[m1]

    return (center1+center2)/2. 
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市秀睛,隨后出現(xiàn)的幾起案子尔当,更是在濱河造成了極大的恐慌,老刑警劉巖蹂安,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件椭迎,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡田盈,警方通過查閱死者的電腦和手機(jī)畜号,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來允瞧,“玉大人简软,你說我怎么就攤上這事蛮拔。” “怎么了痹升?”我有些...
    開封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵建炫,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我疼蛾,道長(zhǎng)肛跌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任察郁,我火速辦了婚禮衍慎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘绳锅。我一直安慰自己西饵,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開白布鳞芙。 她就那樣靜靜地躺著眷柔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪原朝。 梳的紋絲不亂的頭發(fā)上驯嘱,一...
    開封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音喳坠,去河邊找鬼鞠评。 笑死,一個(gè)胖子當(dāng)著我的面吹牛壕鹉,可吹牛的內(nèi)容都是我干的剃幌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼晾浴,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼负乡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起脊凰,我...
    開封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤抖棘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后狸涌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體切省,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年帕胆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了朝捆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡懒豹,死狀恐怖芙盘,靈堂內(nèi)的尸體忽然破棺而出诊杆,到底是詐尸還是另有隱情,我是刑警寧澤何陆,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站豹储,受9級(jí)特大地震影響贷盲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜剥扣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一巩剖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧钠怯,春花似錦佳魔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至断国,卻和暖如春贤姆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背稳衬。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工霞捡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人薄疚。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓碧信,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親街夭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子砰碴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

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

  • <center>#1 Two Sum</center> link Description:Given an arr...
    鐺鐺鐺clark閱讀 2,164評(píng)論 0 3
  • 數(shù)組常見的查找操作如下: 需求:給一個(gè)數(shù)組,查找某個(gè)元素在數(shù)組中的位置莱坎,如果該元素不存在衣式,則返回-1。//正常查找...
    我的天空分外藍(lán)閱讀 424評(píng)論 0 0
  • 給定一個(gè)排序數(shù)組nums(nums中有無重復(fù)元素)檐什,且nums可能以某個(gè)未知下 標(biāo)旋轉(zhuǎn)碴卧,給定目標(biāo)值target,求...
    徐凱_xp閱讀 578評(píng)論 0 1
  • 反轉(zhuǎn)的排序數(shù)組的查找問題 輸入:一個(gè)反轉(zhuǎn)的排序數(shù)組 + 查找 target輸出:target 的 index / ...
    MikeShine閱讀 521評(píng)論 0 0
  • 昨天斷斷續(xù)續(xù)的下了幾場(chǎng)雨乃正,今早起床住册,只覺涼意蔓延全身。似乎瓮具,酷暑已被這微雨渦卷消融荧飞。望著滿地的落葉凡人,驚覺已是深秋!...
    玫瑰的灰燼閱讀 127評(píng)論 3 6