荷兰国旗问题是:给定一个数组与目标值target。
将这个数组作如下变换:小于target的放在数组的左边,等于target的放中间,而大于target的放在数组的右边。
如数组 [2, 6, 2, 4, 6, 9, 8, 2, 1, 6, 6, 1, 5, 9, 3], target = 6.
排序之后是:[2, 2, 4, 3, 5, 2, 1, 1, 6, 6, 6, 6, 9, 8, 9]
程序如下:
public class DutchFlag {
public int[] dutchFlag(int[] nums, int target) {
int leftValue = -1;
int pointer = 0;
int rightValue = nums.length;
while (pointer < rightValue) {
if (nums[pointer] - target < 0) {
swap(nums, leftValue, pointer);
pointer += 1;
leftValue += 1;
}else if(nums[pointer] - target == 0) {
pointer += 1;
}else {
swap(nums, pointer - 1, rightValue - 1);
rightValue -= 1;
}
}
return nums;
}
public static void swap(int nums[], int L, int R) {
int tmpValue = nums[L + 1];
nums[L + 1] = nums[R];
nums[R] = tmpValue;
}
}