問題描述:
給定一個整數數組,給定一個值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;
}
}