荷兰国旗 Flag of the Kingdom of the Netherlands
問題描述:現有n個紅白藍三種不同顏色的小球,亂序排列在一起,請通過兩兩交換任意兩個球,使得從左至右的球依次為紅球、白球、藍球。這個問題之所以叫做荷蘭國旗,是因為將紅白藍三色的小球弄成條狀物,并有序排列后正好組成荷蘭國旗。
解題方法1:蠻力求解
解題方法2:為了討論方便用數字0表示紅色球,用數字1表示白色球,用數字2表示藍色球,所以最后的排序就是0...1...2...
快速排序基于劃分過程,選取主元間整個數組劃分為兩個子數組。是否可以借鑒劃分過程設定三個指針完成一次遍歷完成重新排列,使得所有的球排列成三類不同顏色的球?
(1)設置三個指針: 一個前指針begin,一個中指針current,一個后指針。
current指針遍歷整個數組序列
(2)當current指針所指元素為0時,與begin指針所指的元素進行交換(只是交換元素不交換指針位置),然后current++,begin++
(3)當current指針所指元素為1時,不做任何交換(即不移動球),然后current++
(4)當current指針所指元素為2時,與end指針所指的元素進行交換(同樣直交換元素不交換指針位置),然后current指針位置不動,end--
參考代碼:
#include <bits/stdc++.h>using namespace std;void FranceFlag( int *a , int n ) {int begin = 0 ;int current = 0 ;int end = n - 1 ;while( current <= end ){if( a[current] == 0 ){swap( a[begin] , a[current] );begin++;current++;}else if( a[current] == 1 ){current++;}else{swap( a[end], a[current] );end--;}}for( int i = 0 ; i < n ; i ++ ){cout<<a[i]<<" ";}cout<<endl; } int main() {int a[] = {0,1,2,1,1,2,0,2,1,0};FranceFlag(a,10); }GCC運行結果:
舉一反三:
給定一個只有R、G、B三個字符的字符串,請重新排列該字符串中的字符,使得新字符串中的各個字符的排序順序為:R在前,G在中,B在后。要求空間復雜度為O(1)且只能遍歷一次字符串
轉載請注明:www.cnblogs.com/zpfbuaa
?
轉載于:https://www.cnblogs.com/zpfbuaa/p/5354638.html
總結
以上是生活随笔為你收集整理的荷兰国旗 Flag of the Kingdom of the Netherlands的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 虫孔Router
- 下一篇: 读《构建之法》第4章有感