给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
第一个想法:计数,遍历数组分别计算0、1、2的个数,然后对数组重新赋值。
public void sortColors(int[] nums) {
int l = nums.length;
int[] count = new int[3];
for(int i=0; i<l; i++){
count[nums[i]]++;
}
for(int i=0; i<l; i++){
if(i<count[0]) nums[i] = 0;
else if(i>=count[0]&&i<count[1]+count[0]) nums[i] = 1;
else nums[i] = 2;
}
第二个想法:首尾分别设置指针,left、right,遍历数组遇到0就与left交换到左边,遇到2就与right交换到右边。
public void sortColors(int[] nums) {
int left = 0;
int right = nums.length-1;
for(int i=0; i<=right; i++){
if(nums[i] == 0){
nums[i] = nums[left];
nums[left] = 0;
left++;
}
if(nums[i] == 2){
nums[i] = nums[right];
nums[right] = 2;
i--;
right--;
}
}
}
网上很简洁的解法:
public void sortColors(int[] nums) {
int i = -1;
int j = -1;
int k = -1;
for(int p = 0; p < nums.length; p ++)
{
//根据第i个数字,挪动0~i-1串。
if(nums[p] == 0)
{
nums[++k] = 2; //2往后挪
nums[++j] = 1; //1往后挪
nums[++i] = 0; //0往后挪
}
else if(nums[p] == 1)
{
nums[++k] = 2;
nums[++j] = 1;
}
else
nums[++k] = 2;
}
}