合併k個有序陣列

2022-08-11 21:12:15 字數 692 閱讀 3249

在網上看到的今日頭條面試題

先說下自己的想法吧

假設陣列是從小到大的

用傳統的歸併排序,先把第乙個陣列(a)拿出來,然後第二個陣列的第乙個插入a中

此時使用二分查詢,l=1 r=len_a,假設最後插入的地方是poi

那麼插入第二個數的時候 l = poi+1 r = len_a +1

這東西的時間複雜度是常數比較小的(nk)log(nk)

在寫部落格的時候發現了乙個更好的方法

我可以頭插乙個尾插乙個,不斷更新l,r

常數應該更小

在實際實現的時候發現,emmm這東西得用鍊錶,要不然複雜度太高了

懶得寫鍊錶了(逃~

結果發現如果用鍊錶就不能二分查詢,emmm果然自己還是太年輕

網上看到的解法:

就是如果我合併兩個有序陣列的話我是可以在o(2*n)的時間複雜的下完成的

就是開乙個標記,記錄插入到哪了,然後乙個陣列往另乙個陣列中插入

那麼擴充套件到k個陣列,就是開k個標記,記錄這k個陣列中未插入的最小值在哪

然後每次插入就在這k個中找最小值,插到目標陣列中,在移動標記

那麼時間複雜度是o(n*k*k)

可以看到,在k個中找最小值就相當於拿出最小堆的堆頂元素,移動標記就相當於插入元素

那麼利用最小堆,時間複雜度可以優化到o(n*k*logk)

emmmm反正比我的方法好吶

合併K個有序陣列

問題 有k個長度為n的有序陣列,將著這些個陣列合併為乙個有序的陣列。問題的改進 有k個長度不定的有序陣列,將這些陣列合併為乙個有序陣列。三種解法 第一種解法的時間複雜度為 o nlog2n 第二種解法的時間複雜度為 o knlogn 第三種解法的時間複雜度為 o mnlogn m為元素總個數 第一二...

23 合併K個有序陣列

利用21題合併兩個有序陣列的 使用for迴圈進行合併,效率較低 參照第一名的 使用分治,改變對陣列的處理方法,可以大幅度提高處理效率 修改後 public listnode mergeklists listnode lists public static listnode sort listnode...

合併兩個有序陣列

例如 陣列a1 陣列a2 則合併為a3 思路 依次掃瞄a1和a2的元素 比較當前元素的值,將較小的元素賦給a3,直到乙個陣列掃瞄完畢,然後將另乙個陣列的剩餘元素賦給a3即可。陣列a3的容量需要容納a1和a2兩個陣列和長度和。實現 include include void merge int a1,i...