【問題】
現有紅白藍三個不同顏色的小球,亂序排列在一起。請重新排列這些小球,使得紅白藍三色的同顏色的球在一起。這個問題之所以叫荷蘭國旗問題,是因爲我們可以將紅白藍三色小球想象成條狀物,有序排列後正好組成荷蘭國旗。
【分析】
這個問題我們可以將這個問題視爲一個數組排序問題。紅、白、藍分別對應數字0、1、2。每種顏色的小球數量並不一定相同。
要求:空間複雜度是O(1),且只能遍歷一次字符串。
只是需要用到三個指針:一個前指針begin,一箇中指針current,一個後指針end,current指針遍歷整個數組序列,當
1. current指針所指元素爲0時,與begin指針所指的元素交換,而後current++,begin++ ;
2. current指針所指元素爲1時,不做任何交換(即球不動),而後current++ ;
3. current指針所指元素爲2時,與end指針所指的元素交換,而後,current指針不動,end-- 。
package algorithm;
public class NetherlandFlag {
public static void sort(int[] source){
int len = source.length;
int begin = 0; //初始指向第一個
int current = 0; //初始指向第一個
int end = len - 1; //初始指向最後一個
while(current < end){
if(source[current] == 0){ //對應上述情況1
source[current] = source[begin];
source[begin] = 0;
begin++;
current++;
}else if(source[current] == 1){ //對應上述情況2
current++;
}else if(source[current] == 2){ //對應上述情況3
source[current] = source[end];
source[end] = 2;
end--;
}
}
}
public static void main(String[] args) {
int[] input = {1,2,2,1,0,0,1,2,1,1,0,0,0,2,2,1,0,0,2,1,0};
sort(input);
for(int i=0; i<input.length; i++){
System.out.print(input[i] + " ");
}
System.out.println("\n");
}
}
參考:https://yq.aliyun.com/articles/3604