问题
例子
思路
-
方法1
计数排序的两趟扫描算法。
首先,迭代计算出0、1 和 2 元素的个数,然后按照0、1、2的排序,重写当前数组。 -
方法2
三个指针,i之前所有的数都是0,j之后所有的数都是2,k为当前的下标。
nums[k]==0,交换k和i下标的数,并将k++,i++
nums[k]==1,k++
nums[k]==2,交换k和j下标的数,并将j–;因为k左边的值已经扫描过了,所以k与i交换值时,k要++继续扫描下一位,而与j交换的值,k未扫描,要停下来扫描一下,所以k不用++
代码
//方法1
class Solution {
public void sortColors(int[] nums) {
int red=0,white=0,blue=0;
for(int n: nums){
if(n==0) red++;
else if(n==1) white++;
else blue++;
}
for(int i=0; i<nums.length; i++) {
if(i<red) nums[i]=0;
else if(i>=red && i<red+white) nums[i]=1;
else nums[i]=2;
}
return ;
}
}
//方法2
class Solution {
public void sortColors(int[] nums) {
//i下标前全是0,j下标后全是2
int i=0, j=nums.length-1;
int k=0;
while(k<=j) {
if(nums[k]==0){
int t = nums[i];
nums[i]=nums[k];
nums[k]=t;
i++;
k++;
}else if(nums[k]==2) {
int t = nums[j];
nums[j]=nums[k];
nums[k]=t;
j--;
}else k++;
}
return ;
}
}