【leetcode】75.Sort Colors
阿新 • • 發佈:2019-01-26
使用計數 順序 復雜 相同 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