LeetCode 75 颜色分类 HERODING的LeetCode之路

    科技2024-01-01  99

    给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。

    此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。

    注意: 不能使用代码库中的排序函数来解决这道题。

    示例:

    输入: [2,0,2,1,1,0] 输出: [0,0,1,1,2,2]

    进阶:

    一个直观的解决方案是使用计数排序的两趟扫描算法。 首先,迭代计算出0、1 和 2 元素的个数,然后按照0、1、2的排序,重写当前数组。 你能想出一个仅使用常数空间的一趟扫描算法吗?

    解题思路: 刚看到题目,那自然使用排序算法啦!sort不香嘛?于是乎:

    class Solution { public: void sortColors(vector<int>& nums) { sort(nums.begin(), nums.end()); } };

    提交也是正确,仔细一看傻眼了,不给用类库,只能自己排序了呜呜呜,于是想到了一个比较不同的想法,就是分别统计出0,1,2的个数,再重新按照数目赋值给nums即可,代码如下:

    class Solution { public: void sortColors(vector<int>& nums) { int len = nums.size(); int num1 = 0; int num2 = 0; int num3 = 0; for(int i = 0; i < len; i ++){ if(nums[i] == 0){ num1 ++; } if(nums[i] == 1){ num2 ++; } if(nums[i] == 2){ num3 ++; } } vector<int> v1(num1, 0); vector<int> v2(num2, 1); vector<int> v3(num3, 2); v1.insert(v1.end(),v2.begin(), v2.end()); v1.insert(v1.end(),v3.begin(), v3.end()); nums = v1; } };

    下一个思路相似

    class Solution { public: void sortColors(vector<int>& nums) { int len = nums.size(); int num1 = 0; int num2 = 0; int num3 = 0; for(int i = 0; i < len; i ++){ if(nums[i] == 0){ num1 ++; } if(nums[i] == 1){ num2 ++; } if(nums[i] == 2){ num3 ++; } } for(int i = 0; i < len ; i ++){ if(num1 > 0){ nums[i] = 0; num1 --; continue; } if(num2 > 0){ nums[i] = 1; num2 --; continue; } if(num3 > 0){ nums[i] = 2; num3 --; continue; } } } };
    Processed: 0.021, SQL: 8