【问题】
现有红白蓝三个不同颜色的小球,乱序排列在一起。请重新排列这些小球,使得红白蓝三色的同颜色的球在一起。这个问题之所以叫荷兰国旗问题,是因为我们可以将红白蓝三色小球想象成条状物,有序排列后正好组成荷兰国旗。
【分析】
这个问题我们可以将这个问题视为一个数组排序问题。红、白、蓝分别对应数字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-- 。
![](https://i-blog.csdnimg.cn/blog_migrate/962e05751d755a0cb951ebe9ada8cc42.webp?x-image-process=image/format,png)
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