高頻面試考題:荷蘭旗問題

荷蘭旗問題又稱三色排序,或者彩虹排序,算法

由於荷蘭旗就三種顏色嘛,那這道題的問題就是給你三種顏色,按照給定的順序排好。數組

固然了,題目的問法各類各樣,有的給數字,有的給字母,但本質都是同樣的。oop

好比給你一個只含有三個數字的數組:312312312231111122113,
要求按照 1 2 3 的順序排好,即:
111111111222222222223333333333
(請不要真的去數數,認真你就輸了)spa

仍是用咱們經典的「擋板法」。3d

在快排中,咱們用了兩個擋板把數組分紅三個區域:指針

<= pivot;未排序區間;> pivot

那麼這裏就要三個擋板,分紅四個區域:blog

1, 2, 3, 未排序區間

Partition

具體說來,用 i, j, k 這三個指針分一下:
[0, i): 存 1
[i, j): 存 2排序

(k, array.length-1]: 存 3rem

這裏 j 放在未排序區間的左邊和右邊都行,但基本上你們都是放左邊,因此咱們也不必「標新立異」。it

初始化:

i = 0;
j = 0;
k = array.length - 1;
這樣才能保證 1,2,3 的每一個區間都爲空。

咱們經過觀察指針 j 指向的元素來不斷縮小未排序區間,直到爲空。

例子:1232312

爲了好看,排好序的元素咱們用 RGB 三原色標示一下。

Step1.

指針 j 指向 1,而 1 應該放在 [0, i) 區間內,
這裏應該把指針 i 和指針 j 所指的元素交換一下,而且倆指針往前走。

雖然在這步看來是否交換沒什麼區別,可是若是 i 和 j 之間有元素,就有區別了,好比 Step7.

Step2.

指針 j 指向 2,而 2 應該放在 [i, j) 區間內,因此 j++.

Step3.

指針 j 指向 3,而 3 應該放在
(k, array.length-1] 區間內,因此這裏
j 和 k 指向的元素交換一下,而且 k--.

注意這裏就不能 j-- 了,由於新換回來的元素還沒瞧呢,不知道它是幾。

Step4.

指針 j 指向 2,同 Step2,直接移動指針 j 便可。

Step5.

繼續移動指針 j。

Step6.

同 Step3.

Step7.

這一步就很明顯看出來了,
因爲 1 應該放在 [0,i) 區間,因此這裏把指針 i,j 所指向的元素交換一下,而且 i++, j++.

這樣未排序區間爲空,咱們就排好了~

時間複雜度

這個算法的 bottle neck 就在這個 while loop 裏了,每次循環是 O(1),總共是 O(n).

空間複雜度

O(1)

今天的題目就到這裏啦,大家還喜歡嗎?還有什麼想讓我寫的能夠留言告訴我哦~

五月的最後一天,五月天只會遲到,但不會缺席。

看着今日的線上演唱會,讓我想起上一次去五月天的演唱會,仍是三年前他們來紐約的「人生無限公司巡迴演唱會」,翻了翻朋友圈,歷歷在目。

新的一週,新的一月,祝你們節日快樂吖~

願你我走出半生,歸來還是少年。

相關文章
相關標籤/搜索