1. 程式人生 > >【leetcode】75.Sort Colors

【leetcode】75.Sort Colors

使用計數 順序 復雜 相同 problem 思路 count1 rtc 一個

題目說明

給定一個包含紅色、白色和藍色,一共 n 個元素的數組,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色、白色、藍色順序排列。
此題中,我們使用整數 0、 1 和 2 分別表示紅色、白色和藍色。
https://leetcode-cn.com/problems/sort-colors/

解法1

時間復雜度:O(n)
空間復雜度:O(1)
思路:使用計數排序法,先遍歷一遍統計出各個顏色的個數,然後再遍歷第二遍,按指定順序賦值。

void sortColors(vector<int>& nums) 
{
    int count0 = 0,count1 = 0, count2 = 0;

    for (int i = 0; i < nums.size(); i ++)
    {
        if (nums[i] == 0)
            count0 ++;
        else if (nums[i] == 1)
            count1 ++;
        else if (nums[i] == 2)
            count2 ++;
    }
    for (int i = 0; i < nums.size(); i ++)
    {
        if (i < count0)
            nums[i] = 0;
        else if ( i < count0 + count1)
            nums[i] = 1;
        else
            nums[i] = 2;
    }
}

解法2

時間復雜度:O(n)
空間復雜度:O(1)
思路:桶排序,建立數組來記錄各個數值的個數,數組的下標即數值,數組中各個元素即相應的個數。第一次循環,將記錄裝入數組,第二次循環,將數組依次放入待排序數組之中。即完成排序。
比第一種解法更具拓展性。
桶排序

void sortColors(vector<int>& nums) 
{
    int count[3] = {0};

    for (int i = 0; i < nums.size(); i ++)
    {
        count[nums[i]] ++;
    }

    int j = 0;
    for (int i = 0; i < nums.size();)
    {
        if (count[j]-- > 0)
        {
            nums[i++]  = j;
        }
        else
            j ++;//下一個桶
    }
}

【leetcode】75.Sort Colors