法一:本题首先用了比较简单的方法,由于题目给定是0,1,2三个数,所以要考虑利用这个条件。用一个容量为3的数组标记0,1,2分别出现的次数,然后用一个index索引标记插入原数组的位置,用三次for循环把0,1,2分别赋值回原数组。
class Solution {
public void sortColors(int[] nums) {
int j = 1;
int[] a = new int[3];
for (int i = 0; i < nums.length; i ++) {
a[nums[i]] ++;
}
int index = 0;
for (int i = 0; i < a[0]; i ++) {
nums[i] = 0;
index ++;
}
for (int i = 0; i < a[1]; i ++) {
nums[index] = 1;
index ++;
}
for (int i = 0; i < a[2]; i ++) {
nums[index++] = 2;
}
}
}
法二:可直接遍历一次,但是我没做出来,下方是代码,还有正确代码
class Solution {
public void sortColors(int[] nums) {
int zero = -1;
int two = nums.length;
for (int i = 0; i < nums.length; i ++) {
if (nums[i] == 0) {
zero ++;
int temp = nums[i];
nums[i] = nums[zero];
nums[zero] = temp;
}
//这一步i < two 不加上连范例都是错的
if (i < two && nums[i] == 2) {
two --;
int a = nums[i];
nums[i] = nums[two];
nums[two] = a;
}
}
}
}
正确结果:
class Solution {
public void sortColors(int[] nums) {
int n = nums.length;
int p0 = 0, p2 = n - 1;
for (int i = 0; i <= p2; ++i) {
while (i <= p2 && nums[i] == 2) {
int temp = nums[i];
nums[i] = nums[p2];
nums[p2] = temp;
--p2;
}
if (nums[i] == 0) {
int temp = nums[i];
nums[i] = nums[p0];
nums[p0] = temp;
++p0;
}
}
}
}