问题描述:
给定一个整数数组,给定一个值K,这个值在原数组中一定存在,要求把数组中小于K的元素放到数组的左边,大于K的元素放到数组的右边,等于K的元素放到数组的中间,最终返回一个整数数组。
例如:
给定数组
[2, 3, 1, 4, 7, 6, 5, 10, 9],给定一个值9,
那么经过处理后结果数组是:
[2, 3, 1 ,4, 7, 6, 5, 9, 10 ]
代码:
/**
* @description:荷兰国旗问题 任给一个数为划分值,小于它的放在他的前面,等于它的放在中间,大于他的放在他的后面。 分成三部分
* @Author MRyan
* @Date 2020/5/12 9:31
* asi
*/
public class Dutchflag {
public static void main(String[] args) {
int[] nums = {2, 3, 1, 4, 7, 6, 5, 10, 9};
int target = 9;
int[] solve = solve(nums, 0, nums.length - 1, target);
for (int i : solve) {
System.out.print(i + " ");
}
System.out.println();
for (int i : nums) {
System.out.print(i + " ");
}
}
/**
* @param nums
* @param l
* @param r
* @param target
* @return 大于区小于区左右边界的位置
*/
public static int[] solve(int[] nums, int l, int r, int target) {
// )2 3 1 5 7 6 5 4 5(
//小于区边界 初始化任何元素都不放在小于区
int left = l - 1;
//大于区边界 初始化任何元素都不放在大于区
int right = r + 1;
//当前值索引超过大于区边界退出结束
while (l < right) {
//当前值nums[l] 等于 划分值
if (nums[l] == target) {
//当前值位置后移
l++;
}
//当前值nums[l] 小于 划分值
else if (nums[l] < target) {
//小于区下一个元素和当前值交换 并且 小于区边界后移 当前值位置后移
swap(nums, ++left, l++);
}
//当前值nums[l] 大于 划分值
else if (nums[l] > target) {
//大于区前一个元素和当前值交换 并且 大于区边界前移 下次循环继续比较当前值和划分值大小
swap(nums, --right, l);
}
}
return new int[]{left + 1, right};
}
public static void swap(int[] nums, int l, int r) {
int temp = nums[l];
nums[l] = nums[r];
nums[r] = temp;
}
}