480. Sliding Window Median

Ref: https://leetcode-cn.com/problems/sliding-window-median/

這道題主要有兩種思路解決豆胸,一是一開始想到的數(shù)組暴力法,二是利用二分查找思想實現(xiàn)O(nk)時間復(fù)雜度的方法预愤。
首先殴泰,對于一個有序數(shù)組a五督,計算中位數(shù)可以采用下述實現(xiàn):

median = lambda a: (a[(len(a) - 1) // 2] + a[len(a) // 2]) / 2

數(shù)組暴力法

使用數(shù)組暴力法押逼,控制窗口滑動箫措,并對窗口內(nèi)序列進行排序塑陵,進而計算中位數(shù)并存入最終結(jié)果爱态,代碼如下:

class Solution:
    def medianSlidingWindow(self, nums: List[int], k: int) -> List[float]:
        median = lambda a: (a[(len(a)-1)//2] + a[len(a)//2]) / 2
        res = []
        for i in range(len(nums)-k+1):
            res.append(median(sorted(nums[i:i+k])))
        return res

由于進行了n次排序谭贪,因此時間復(fù)雜度為O(nklogk)

數(shù)組二分法

使用數(shù)組二分法锦担,主要思路如下:

對于測試用例:

nums = [1, 3, -1, -3, 5]
k = 2
  • 初始化前k個元素的數(shù)組a = [1, 3]俭识,排序,計算中位數(shù)放入result洞渔,之后在此基礎(chǔ)上進行如下操作滑動窗口(窗口大小k套媚,步長為1,左邊界為i磁椒,右邊界為j):
    1. [1,3]向左滑動堤瘤,移除左邊界i上的元素1,增加右邊界j上的元素-1浆熔,為保持?jǐn)?shù)組a有序性本辐,采用二分查找刪除和插入,其中pop和insert時間復(fù)雜度為O(k)医增,二分查找為O(logk)慎皱,得到[-1, 3]
    2. 同理叶骨,[-1, 3] \rightarrow [-3, -1]茫多;
    3. 同理,[-3, -1] \rightarrow [-3, -1]忽刽;
    4. 最后天揖,[-3, -1] \rightarrow [-3, 5]
  • 為方便起見直接調(diào)用了Python的bisect庫缔恳,事實上查閱其源代碼宝剖,這里也可以自己寫出二分查找算法,代碼如下:
   def find(self, a, value):
       lo = 0
       hi = len(a)
       while lo < hi:
           mid = (lo + hi) // 2
           if a[mid] < value:
               lo = mid + 1
           else:
               hi = mid
       return lo

因此歉甚,全部算法代碼實現(xiàn)如下:

class Solution:
    def medianSlidingWindow(self, nums: List[int], k: int) -> List[float]:
        median = lambda x: (x[(len(x) - 1) // 2] + x[len(x) // 2]) / 2
        a = nums[:k]
        a.sort()
        result = [median(a)]
        for i, j in zip(nums[:-k], nums[k:]):
            a.pop(bisect.bisect_left(a, i))
            a.insert(bisect.bisect_left(a, j), j)
            result.append(median(a))
        return result
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市扑眉,隨后出現(xiàn)的幾起案子纸泄,更是在濱河造成了極大的恐慌赖钞,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件聘裁,死亡現(xiàn)場離奇詭異雪营,居然都是意外死亡,警方通過查閱死者的電腦和手機衡便,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進店門献起,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人镣陕,你說我怎么就攤上這事谴餐。” “怎么了呆抑?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵岂嗓,是天一觀的道長。 經(jīng)常有香客問我鹊碍,道長厌殉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任侈咕,我火速辦了婚禮公罕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘耀销。我一直安慰自己熏兄,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布树姨。 她就那樣靜靜地躺著摩桶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪帽揪。 梳的紋絲不亂的頭發(fā)上硝清,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天,我揣著相機與錄音转晰,去河邊找鬼芦拿。 笑死,一個胖子當(dāng)著我的面吹牛查邢,可吹牛的內(nèi)容都是我干的蔗崎。 我是一名探鬼主播,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼扰藕,長吁一口氣:“原來是場噩夢啊……” “哼缓苛!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起邓深,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤未桥,失蹤者是張志新(化名)和其女友劉穎笔刹,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冬耿,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡舌菜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了亦镶。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片日月。...
    茶點故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖缤骨,靈堂內(nèi)的尸體忽然破棺而出爱咬,到底是詐尸還是另有隱情,我是刑警寧澤荷憋,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布台颠,位于F島的核電站,受9級特大地震影響勒庄,放射性物質(zhì)發(fā)生泄漏串前。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一实蔽、第九天 我趴在偏房一處隱蔽的房頂上張望荡碾。 院中可真熱鬧,春花似錦局装、人聲如沸坛吁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拨脉。三九已至,卻和暖如春宣增,著一層夾襖步出監(jiān)牢的瞬間玫膀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工爹脾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留帖旨,地道東北人。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓灵妨,卻偏偏與公主長得像解阅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子泌霍,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,781評論 2 361

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