在網上看到的今日頭條面試題
先說下自己的想法吧
假設陣列是從小到大的
用傳統的歸併排序,先把第乙個陣列(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...