LeetCode顏色分類

題目 顏色分類

給定一個包含紅色、白色和藍色,一共 n 個元素的數組,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色、白色、藍色順序排列。

此題中,我們使用整數 0、 1 和 2 分別表示紅色、白色和藍色。

注意:
不能使用代碼庫中的排序函數來解決這道題。

來源:力扣(LeetCode)

思想

  • 利用快速排序的一次劃分思想,第一次劃分將值爲0的元素放在非0元素之前,並且返回分界下標。將分界下標後的子數組進行劃分,將值爲1的元素放在非1的元素之前。
  • 時間複雜度爲O(n),空間複雜度爲O(1)

代碼

//使用雙指針,思想類似於快排中的partition 劃分

void swap(int *a,int *b){
    int tmp=*a;
    *a=*b;
    *b=tmp;
}

int part(int flag,int *nums,int low,int high,int numsSize){
    
    while(low<high){
        while(low<high&&nums[low]==flag) low++;
        swap(&nums[low],&nums[high]);
        while(low<high&&nums[high]!=flag) high--;
        swap(&nums[high],&nums[low]);
    }
    //返回調整後 數組中不等於flag元素的第一個下標或最後一個元素的下標 
    if(low<numsSize&&nums[low]==flag)
        return low+1;
    return low;
}

void sortColors(int* nums, int numsSize){
    if(numsSize==0||numsSize==1)
        return ;
    int low=0,high=numsSize-1;
    //part劃分只能劃分出兩個區間,所以要劃分出三種區間,應該進行兩次劃分
    low=part(0,nums,low,high,numsSize);
    part(1,nums,low,high,numsSize);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章