面試常考演算法題 二 荷蘭國旗問題

2021-08-28 09:36:05 字數 1746 閱讀 9907

荷蘭國旗問題是面試中常考的乙個題目,涉及到的思想並不是很複雜.

給定乙個陣列arr,和乙個數num,請把小於num的數放在陣列的左邊,等於num的數放在陣列的中間,大於num的數放在陣列的右邊。

要求額外空間複雜度o(1),時間複雜度o(n)

最差解法

這個問題如果不考慮時間複雜度和空間複雜度的話,最簡單的解法自然是使用輔助陣列,對當前陣列資料進行分類以後複製回原陣列,**如下:

public

static

int[

]terriblepartition

(int

arr,

int num)

int[

] temp =

newint

[arr.length]

;int m =-1

;int n = arr.length ;

//設定兩個指標,分別指向temp陣列的最前面和最後面,將小於num的資料放在前部分,大於num的資料放在後部分

for(

int i =

0; i < arr.length; i++

)else

if(arr[i]

> num)

}//等於num的陣列資料放在中間

for(

int i = m +

1; i < n; i++

)//複製temp陣列資料到arr陣列

copyarr

(arr, temp)

;//返回等於num資料的位置

return

newint

;}private

static

void

copyarr

(int

arr,

int[

] temp)

}

這個答案除非題目不要求並且時間不足夠思考更優秀的演算法,不然不建議使用此方法,這種解法一般僅用作比較器.

優秀一點的解法

那麼如何在上述方法上進行優化呢,其實本質所使用的思想和上述**思想一致.知道讀者未必對上面的**感興趣,這裡我來通過乙個實際陣列[4, 5, 2, 8, 1, 9, 6, 11]進行**一下:

**

public

static

int[

]partition

(int

arr,

int num)

int less =-1

;int more = arr.length;

int i =0;

while

(i < more)

else

if(arr[i]

> num)

else

}//返回等於num資料的位置

return

newint

;}private

static

void

swap

(int

arr,

int i,

int j)

假定在待排序的記錄序列中,存在多個具有相同的關鍵字的記錄,若經過排序,這些記錄的相對次序保持不變,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序後的序列中,r[i]仍在r[j]之前,則稱這種排序演算法是穩定的;否則稱為不穩定的。

演算法 荷蘭國旗問題

荷蘭國旗是由紅白藍3種顏色的條紋拼接而成,如下圖所示 假設這樣的條紋有多條,且各種顏色的數量不一,並且隨機組成了乙個新的圖形,新的圖形可能如下圖所示,但是絕非只有這一種情況 需求是 把這些條紋按照顏色排好,紅色的在上半部分,白色的在中間部分,藍色的在下半部分,我們把這類問題稱作荷蘭國旗問題。我們把荷...

演算法之荷蘭國旗問題

問題描述 荷蘭國旗有三橫條塊構成,自上到下的三條顏色依次為紅,白,藍。現有若干由紅,白,藍三種顏色的條塊序列,要將它們重新排列使所有相同顏色的條塊在一起。本問題要求將所有紅色的條塊放在最左邊,所有白色的條塊放在中間,所有藍色的條塊放在最右邊。解決辦法 將三種顏色放入乙個數字中,前部分為紅色,中間部分...

演算法習作 荷蘭國旗問題

出處 1.問題描述 我們將亂序的紅白藍三色小球排列成有序的紅白藍三色的同顏色在一起的小球組。這個問題之所以叫荷蘭國旗,是因為我們可以將紅白藍三色小球想象成條狀物,有序排列後正好組成荷蘭國旗。2.問題分析 這個問題我們可以將這個問題視為乙個陣列排序問題,這個陣列分為前部,中部和後部三個部分,每乙個元素...