荷兰国旗问题
荷兰国旗是由红白蓝3种颜色的条纹拼接而成,如下图所示:
假设这样的条纹有多条,且各种颜色的数量不一,并且随机组成了一个新的图形,新的图形可能如下图所示,但是绝非只有这一种情况:
需求是:把这些条纹按照颜色排好,红色的在上半部分,白色的在中间部分,蓝色的在下半部分,我们把这类问题称作荷兰国旗问题。
荷兰国旗问题抽象为如下描述:
给定一个数组arr,和一个数num,请把小于num的数放在数组的左边,等于num的数放在数组的中间,大于num的数放在数组的右边,要求额外空间复杂度为O(1),时间复杂度为O(n)
Java代码实现如下
package problem;
public class DutchFlag {
public static void swap(int[] arr,int i,int j)
{
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
public static void printArray(int[] arr)
{
for(int elem:arr)
{
System.out.print(elem+"\t");
}
System.out.println();
}
public static void partition(int[] arr,int num)
{
int left=-1;
int right=arr.length;
int i=0;
while(i<right)
{
if(arr[i]<num)
{
left++;
if(left!=i)
{
swap(arr,left,i);
}
i++;
}
else if(arr[i]>num)
{
right--;
swap(arr,i,right);
}
else
{
i++;
}
}
}
public static void main(String[] args) {
int[] arr={1,4,5,2,9,8,5,6,7,5,6,2,5,3,1,7,9,8,6,3,4,5};
printArray(arr);
partition(arr,5);
printArray(arr);
}
}
执行结果如下:
1 4 5 2 9 8 5 6 7 5 6 2 5 3 1 7 9 8 6 3 4 5
1 4 2 4 3 1 3 2 5 5 5 5 5 6 7 9 8 6 7 6 8 9