75. Sort Colors(颜色排序) from LeetCode

 

给定一个具有红色,白色或蓝色的n个对象的数组,将它们就地 排序,使相同颜色的对象相邻,颜色顺序为红色,白色和蓝色。

这里,我们将使用整数0,1和2分别表示红色,白色和蓝色。

注意:  您不应该使用库的排序功能来解决此问题。

例:

输入: [2,0,2,1,1,0]
输出: [0,0,1,1,2,2]

跟进:

    • 一个相当直接的解决方案是使用计数排序的两遍算法。
      首先,迭代0,1,和2的数组计数,然后覆盖总数为0的数组,然后是1,然后是2。
    • 你能想出一个只使用恒定空间的一次通过算法吗?

思路1:遍历统计0,1的个数(剩下的就是2啦),然后将0,1,2依次填入

void sortColors(int* nums, int numsSize) {
    int i=0,num0=0,num1=0,temp;
    while(i<numsSize){
        if(nums[i]==0)
            num0++;
        if(nums[i]==1)
            num1++;
        i++;
    }
    i=0,num1=num1+num0;
    while(i<numsSize){
        if(i<num0)
            nums[i]=0;
        else if(i<num1)
            nums[i]=1;
        else nums[i]=2;
        i++;
    }
}
View Code
void sortColors(int* nums, int numsSize) {
    int count[3]={0};//存放0,1,2三个元素的频率
    for(int i=0;i<numsSize;i++){
        assert(nums[i]>=0 && nums[i]<=2);//断言,处理nums有不是0,1,2的值
        count[nums[i]] ++;
    int index = 0;
    for(int j=0;j<3;j++)
        for(int i=0;i<count[j];i++)
          nums[index++] = j;
    }
}
View Code

思路2:

那么接下来插入(读入)一个数,无非就三种情况,即2、1和0

情况一:插入的值为2,则不需任何操作就可以保持前面的数据结构,故可以直接处理下一个数据

情况二:插入的值为1,这是需要交换1和2来保持数据结构不变,操作如下:

情况三:插入的值为0,这是比较麻烦,因为需要分别进行0和2交换,然后0和1交换,操作如下:

void sortColors(int* nums, int numsSize) {
    int i=0,k0=-1,k1=-1,temp;
    while(i<numsSize){
        if(nums[i]==2)i++;//2不变
        else if(nums[i]==1)//1和2交换
        {
            temp=nums[i];
            nums[i++]=nums[++k1];
            nums[k1]=temp;
        }
        else if(nums[i]==0){//0和2换,再和1换
            temp=nums[i];
            nums[i++]=nums[++k1];
            nums[k1]=nums[++k0];
            nums[k0]=temp;
  }
View Code

猜你喜欢

转载自www.cnblogs.com/jakejian/p/10226596.html