荷蘭國旗問題

【問題】

現有紅白藍三個不同顏色的小球,亂序排列在一起。請重新排列這些小球,使得紅白藍三色的同顏色的球在一起。這個問題之所以叫荷蘭國旗問題,是因爲我們可以將紅白藍三色小球想象成條狀物,有序排列後正好組成荷蘭國旗。


【分析】

這個問題我們可以將這個問題視爲一個數組排序問題。紅、白、藍分別對應數字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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章