题目描述
给定一个包含红,白,蓝且长度为 n 的数组,将数组元素进行分类使相同颜色的元素相邻,并按照红、白、蓝的顺序进行排序。
我们可以使用整数 0,1 和 2 分别代表红,白,蓝。
注意事项
不能使用代码库中的排序函数来解决这个问题。
排序需要在原数组中进行。
样例
给你数组 [1, 0, 1, 2], 需要将该数组原地排序为 [0, 1, 1, 2]。
一个相当直接的解决方案是使用计数排序扫描2遍的算法。
首先,迭代数组计算 0,1,2 出现的次数,然后依次用 0,1,2 出现的次数去覆盖数组。
但是这样一共遍历了两遍数组,下面的方法可以只扫描一边数组完成分类操作。
解题思路
在开始和末尾设立两个指针zero(初值为-1)和two初值为(nums.length),使[0,zero]区间的元素全部为零,[two,nums.length-1]区间内的元素全部为一。然后从头扫描数组分别跟据元素为0,1,2进行操作使满足上述假设。
代码如下
public class Main {
/*
* @param nums: A list of integer which is 0, 1 or 2
* @return: nothing
*/
public static void sortColors(int[] nums) {
// write your code here
if(nums==null||nums.length==0){
return;
}
int zero = -1;
int two = nums.length;
int i = 0;
while(i<two){
if(nums[i]==0){
zero++;
nums[i]=nums[zero];
nums[zero]=0;
i++;
}
else if (nums[i]==2){
two--;
nums[i]=nums[two];
nums[two]=2;
}
else if (nums[i]==1){
i++;
}
}
}
}