LeetCode地址:颜色分类
目录
题目
荷兰国旗问题:现在有若干个红、白、蓝三种颜色的球随机排列成一条直线。现在我们的任务是把这些球按照红、白、蓝排序。
荷兰国旗
简单说就是把许多数,按从小到大排序,一样的数放在一起。如下图:
题目实例一:
题目实例二:
解题思路
将数组设置两个边界,分别为左边界,右边界。因为将3个不同的数区分需要两个间隔 o(^▽^)o
但是最开始的时候数组顺序是乱的,所以需要将两个间隔置于两端 |・ω・`)
剩下我们就需要将L线与R线之间的数,排序就好啦 (•̀ᴗ•́)و ̑̑
综上一共需要3个变量,左边界位置为-1,右边界位置为5,指针位置为0
1.指针位置为0时值是2,应在最右侧,将2换到右边界位置,之后R线左移一位,指针位置不变
2.指针位置为0时值是0,应在最左侧,将左边界右移一位变为0位置,将指针与左边界交换,交换之后将指针位置右移一位。此时你会有疑问为什么这样做,先往后看 ( ´・・)ノ(._.`)
3.指针位置为1时值是0,应在最左侧,重复上面的步骤
4.指针位置为2时值是2,应在最右侧,将2换到右边界位置,之后R线左移一位,指针位置不变
你以为指针不会走了?,不不不 (∩•̀ω•́)⊃-*⋆
5.指针位置为2时值是1,应在中间位置,不用交换,将指针位置继续右移就好啦
6.指针位置为3时值是1,应在中间位置,不用交换,将指针位置继续右移
7.指针位置为4时,就可以停止啦,因为右边界右边的值都是经过变换来的了,不需要指针继续往下走判断啦 ╮(~▽~)╭
代码
public class 颜色分类 {
// 数组交换
static void swap(int[] arr, int i, int j) {
arr[i] = arr[i] ^ arr[j];
arr[j] = arr[i] ^ arr[j];
arr[i] = arr[i] ^ arr[j];
}
public static void sortColors(int[] nums) {
// 如果数组长度小于 2 ,不用做
if (nums.length < 2) {
return;
}
// 左边界
int Left = -1;
// 指针
int Middle = 0;
// 右边界
int Right = nums.length - 1;
while (Middle <= Right) {
if (nums[Middle] == 0) {
swap(nums, Middle++, ++Left);
} else if (nums[Middle] == 1) {
Middle++;
} else {
swap(nums, Middle, Right--);
}
}
}
// Main方法:
public static void main(String[] args) {
int[] nums = new int[]{2, 0, 2, 1, 1, 0};
sortColors(nums);
for (int X : nums) {
System.out.print(X + " ");
}
}
}
IDEA运行:
力扣: