1. 程式人生 > >75. Sort Colors(顏色排序) from LeetCode

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

  75. Sort Colors  

給定一個具有紅色,白色或藍色的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