题目链接
思路:
此题属于荷兰国旗问题。
准备三个指针zero、cur、two,
zero代表所指向位置数字为0且前面数字均为0,
cur代表当前所指向的数字
two代表所指向位置数字为2且后面数字均为2
以1作为标识符进行partition
初始时,zero指向-1位置,即0位置的前一个位置,cur指向0位置,two指向num.length位置,即最后一个位置的后一个位置
开始从左向右遍历,
若nums[cur] == 0,则将zero向右移动一位,cur位置与zero位置的数进行交换,cur向后移动一位。此处可以移动cur指针,是因为cur与zero交换之后,能够保证cur所指向的是一定为1,所以可以向后进行移动
若nums[cur] == 1,则cur向后移动一位
若nums[cur] == 2,则将two向左移动一位,cur位置与two位置的数进行交换,此时不可以移动cur指针,因为后面two指向的元素并不确定是几,交换完成后,只能保证two指针处数字为2,cur指针位置的数字无法确定
public void sortColors(int[] nums) {
if (nums == null || nums.length < 2) {
return;
}
int cur = 0;
int zero = -1;
int two = nums.length;
while (cur < two) {
// 当前数字为0,与zero指针所指向位置进行交换
if (nums[cur] == 0) {
zero++;
swap(nums, zero, cur);
cur++;
// 当前数字为1,则直接跳过
} else if (nums[cur] == 1) {
cur++;
// 当前数字为2,与two指针所指向位置进行交换
} else {
two--;
swap(nums, cur, two);
}
}
}
private void swap(int[] nums, int i, int j) {
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}