75. Sort Colors(顏色排序) from LeetCode
阿新 • • 發佈:2019-01-05
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){View Codeif(i<num0) nums[i]=0; else if(i<num1) nums[i]=1; else nums[i]=2; i++; } }
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]<=2View Code);//斷言,處理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; } }
思路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