LeetCode總結 一維資料合併篇

2021-09-07 10:25:50 字數 1579 閱讀 9206

合併是一維資料結構中非經常見的操作, 一般是排序, 分布式演算法中的子操作。 這篇總結主要介紹leetcode中關於合併的幾個題目: 

merge two sorted lists

merge sorted array

sort list

merge k sorted lists

我們先來看看兩個有序一維資料的合併, 這裡主要是要介紹鍊錶的合併操作, 只是由於一維陣列的合併也比較簡單, 並且與鍊錶有比較性, 就順便在這裡列舉一下。 

merge two sorted lists

就是要求合併兩個有序鍊錶, 一般來說合併的思路就是以乙個為主參考, 然後逐項比較, 假設較小元素在參考鍊錶中。 則繼續前進。 否則把結點插入參考鍊錶中。 前進還有乙個鍊錶。 最後假設還有乙個鍊錶還沒到頭就直接接過來就能夠了, 思路和實現都比較簡單。 最好力求一遍過哈。 

merge sorted array

也是一樣的思路, 僅僅是資料結構換成了一維陣列, 所以插入操作比煉表要麻煩一些。 這裡相當於從尾部開始, 然後數字乙個個依照位置填入。 插入操作在這裡就不明顯了。 能夠看出儘管思路近似, 可是資料結構不同, 由於操作不同。 實現細節還是比較不一樣的, 都得熟練掌握哈。

有了上面合併兩個鍊錶(或者陣列)我們就能夠進行

歸併排序

了, 也就是

sort list

這道題目。 對於鍊錶。 用

merge two sorted lists

作為合併的子操作。 然後用

歸併排序

的遞迴進行切割合併就能夠了, 這裡就不說排序的詳細細節了。 會有專門的排序總結篇哈。 

最後我們來說說最重要的也是最有用的乙個題目

merge k sorted lists

。 為什麼說他有用是由於如今分布式系統非常多, 並且也非常強調mapreduce或者hadoop的技術, 這個題目就是分布式計算的乙個常見操作。 比方說來自不同client的有序資料要在central server上面進行合併。 這個問題有兩種做法: 

第一種就是利用上面的

merge two sorted lists

對k個鍊錶先進行兩兩合併, 然後再上一層繼續兩兩合併。 直到合成乙個鍊錶。 依據

merge k sorted lists

中的分析, 時間複雜度是o(nklogk), 空間複雜度是o(logk)。

上面這樣的做法是利用分治然後進行合併的方法, 接下來這種方法用到了堆的資料結構。

思路是維護乙個大小為k的堆, 每次取堆頂的最小元素放到結果中,然後讀取該元素相應的鍊錶的下乙個元素放入堆中。

由於每乙個鍊錶是有序的, 每次又是去當前k個元素中最小的。 所以當全部鍊錶都讀完時結束,這個時候全部元素按從小到大放在結果鍊錶中。 這個演算法每乙個元素要讀取一次,即k*n次,然後每次讀取元素要把新元素插入堆中要o(logk)的複雜度,所以複雜度是o(nklogk), 跟第一種方法是一樣的。

兩種方法不同的資料結構和型別, 都非常具有代表性。 個人認為都非常有意思哈。

合併算是鍊錶中比較典型的操作, 也能夠連續地問出比較連貫的一些題目, 擴充套件性非常好。 既能夠考察基本資料結構的操作。 又能夠看看對於演算法和很多其它資料結構的理解, 是乙個不錯的面試話題。

leetcode 實現一維max pooling

思路有點像滑動視窗最大值。對乙個一維陣列做核為k的max pooling,步長為1,並寫出時間複雜度 思路 使用乙個雙端佇列 deque 作為輔助空間,其中內容為陣列的index。首先處理index從0到size 1 size為核長 如果deque空,直接壓入當前index到佇列尾部,否則對比佇列尾...

資料降維方法總結

經過這幾天面試後,我發現資料降維這一塊在工業界用的很多或者說必不可少,因此,這方面需要重點關注。今天,我將資料降維總結於此,包括他人成果,這裡對他們的內容表示感謝。主成分分析 pca 和判別分析方法 lda 關於pca的理解 1 pca可以理解為高維資料投影到低維,並使得投影誤差最小。是一種無監督將...

資料降維演算法總結

在原始的空間中,包含冗餘資訊以及噪音資訊,在實際應用中總會產生誤差,降低了準確率,我們希望減少冗餘資訊所造成的誤差,提公升識別精度。又或者希望通過降維演算法尋找內部的本質結構特徵。資料降維的目的 維度降低便於視覺化和計算,深層次的含義在於有效資訊的特徵提取以及無用資訊的拋棄。線性對映 pca以及ld...