【問題】
現有紅白藍三個不同顏色的小球,亂序排列在一起,請重新排列這些小球,使得紅白藍三色的同顏色的球在一起。這個問題之所以叫荷蘭國旗問題,是因為我們可以將紅白藍三色小球想象成條狀物,有序排列後正好組成荷蘭國旗。
【分析】
這個問題我們可以將這個問題視為乙個陣列排序問題。紅白藍分別對應數字0、1、2。紅、白、藍三色小球數量並不一定相同。
【思路一】
first, iterate the array counting number of 0's, 1's, and 2's, then overwrite array with total number of 0's, then 1's and followed by 2's.
(1)遍歷陣列,統計紅白藍三色球(0,1,2)的個數
(2)根據紅白藍三色球(0,1,2)的個數重排陣列
時間複雜度:o(n)
【**一】
/**------------------------------------
* 日期:2015-02-02
* 題目: 75.sort colors
* **:
* 結果:ac
* 部落格:
---------------------------------------**/
class solution //if
// 統計個數
int red = 0,white = 0,blue = 0;
for(int i = 0;i < n;++i)//if
else if(a[i] == 1)//else
else//else
}//for
// 重新布局
for(int i = 0;i < n;++i)//if
else if(white > 0)//else
else
}//for}};
【思路二】
我們可以把陣列分成三部分,前部(全部是0),中部(全部是1)和後部(全部是2)三個部分,每乙個元素(紅白藍分別對應0、1、2)必屬於其中之一。
將前部和後部各排在陣列的前邊和後邊,中部自然就排好了。
設定兩個指標begin指向前部的末尾的下乙個元素(剛開始預設前部無0,所以指向第乙個位置),end指向後部開頭的前乙個位置(剛開始預設後部無2,所以指向最後乙個位置),然後設定乙個遍歷指標current,從頭開始進行遍歷。
(1)若遍歷到的位置為1,則說明它一定屬於中部,根據總思路,中部的我們都不動,然後current向前移動乙個位置。
(2)若遍歷到的位置為0,則說明它一定屬於前部,於是就和begin位置進行交換,然後current向前移動乙個位置,begin也向前移動乙個位置(表示前邊的已經都排好了)。
(3)若遍歷到的位置為2,則說明它一定屬於後部,於是就和end位置進行交換,由於交換完畢後current指向的可能是屬於前部的,若此時current前進則會導致該位置不能被交換到前部,所以此時current不前進。而同1),end向前移動乙個位置。
【**二】
/**------------------------------------
* 日期:2015-02-04
* 題目: sort colors
* **:
* 部落格:
---------------------------------------**/
class solution //if
else if(a[cur] == 1)//else
else//else
}//for}};
【思路三】
用三個變數記錄red,white,blue的下標位置。起始下標都為-1
如果a[i] == 0 ,插入red對white blue有影響,blue先整體向後移動一位,white再整體向後移動一位,如果不移動,前面插入的資料就會覆蓋已有的。
如果a[i] == 1,插入white對blue有影響,blue整體向後移動一位。
a[i] == 2,直接插入blue
【**三】
/**------------------------------------
* 日期:2015-02-03
* 題目: 75.sort colors
* **:
* 結果:ac
* 部落格:
---------------------------------------**/
class solution //if
int red = -1,white = -1,blue = -1;
for(int i = 0;i < n;++i)//if
// 插入white blue受到影響
else if(a[i] == 1)//else
// 插入blue對其他沒有影響
else//else
}//for}};
引用: 演算法系列之十一 荷蘭國旗問題
問題 現有紅白藍三個不同顏色的小球,亂序排列在一起,請重新排列這些小球,使得紅白藍三色的同顏色的球在一起。這個問題之所以叫荷蘭國旗問題,是因為我們可以將紅白藍三色小球想象成條狀物,有序排列後正好組成荷蘭國旗。分析 這個問題我們可以將這個問題視為乙個陣列排序問題。紅白藍分別對應數字0 1 2。紅 白 ...
荷蘭國旗系列問題
問題 給定乙個陣列arr和乙個數字num,請把小於num的數放在陣列的左邊,等於num的數放在陣列的中間,大於num的數放在陣列的右邊。要求額外空間複雜度o 1 時間複雜度o n include using namespace std void swap int arr,int i,int j in...
演算法之荷蘭國旗問題
問題描述 荷蘭國旗有三橫條塊構成,自上到下的三條顏色依次為紅,白,藍。現有若干由紅,白,藍三種顏色的條塊序列,要將它們重新排列使所有相同顏色的條塊在一起。本問題要求將所有紅色的條塊放在最左邊,所有白色的條塊放在中間,所有藍色的條塊放在最右邊。解決辦法 將三種顏色放入乙個數字中,前部分為紅色,中間部分...