力扣算法题—075颜色分类
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
注意:
不能使用代码库中的排序函数来解决这道题。
示例:
输入: [2,0,2,1,1,0] 输出: [0,0,1,1,2,2]
进阶:
- 一个直观的解决方案是使用计数排序的两趟扫描算法。
首先,迭代计算出0、1 和 2 元素的个数,然后按照0、1、2的排序,重写当前数组。 - 你能想出一个仅使用常数空间的一趟扫描算法吗
1 #include "_000库函数.h" 2 3 //本来使用sort函数简单无比 4 //但是题目要求不让使用排序函数 5 6 //解法一:计数再生成【两趟扫描】 7 8 //class Solution { 9 //public: 10 // void sortColors(vector<int>& nums) { 11 // int r = 0, w = 0, b = 0;//三种颜色出现次数计数 12 // for (auto a : nums) 13 // if (a == 0)++r; 14 // else if (a == 1)++w; 15 // else ++b; 16 // nums.clear();//重置 17 // nums.insert(nums.end(), r, 0); 18 // nums.insert(nums.end(), w, 1); 19 // nums.insert(nums.end(), b, 2); 20 // } 21 //}; 22 23 //解法二,使用一趟扫描法 24 class Solution { 25 public: 26 void sortColors(vector<int>& nums) { 27 int n = nums.size(); 28 for (int i = 0;i<n;){ 29 vector<int>::iterator p = nums.begin() + i; 30 if (nums[i] == 0) { 31 nums.erase(p, p + 1);//删除 32 nums.insert(nums.begin(), 1, 0);//前插 33 ++i; 34 } 35 else if (nums[i] == 2) { 36 nums.erase(p, p + 1);//删除 37 nums.insert(nums.end(), 1, 2);//后插 38 --n; 39 } 40 else//让1保留在原位 41 ++i; 42 } 43 } 44 }; 45 46 47 void T075() { 48 Solution s; 49 vector<int>v; 50 v = { 2,0,2,1,1,0 }; 51 s.sortColors(v); 52 for (auto a : v) 53 cout << a << ", "; 54 cout << endl; 55 }