leetcode 75 分类颜色

题目要求:

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

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

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

分析:因为只有三个元素,所以可以暴力解决,遍历一遍,把0,1,2标记出现的次数,再次遍历赋值回去。

第二种,用三路快排算法,一次遍历就行。

暴力解决:

class Solution {
public:
    void sortColors(vector<int>& nums) {
        int a[3]={0};
        for(int i=0;i<nums.size();i++)
        {
            assert(nums[i]>=0&&nums[i]<=2);
                a[nums[i]]++;
            
        }
        int index=0;
        for(int i=0;i<a[0];i++)
                  nums[index++]=0;
        for(int i=0;i<a[1];i++)
                      nums[index++]=1;
        for(int i=0;i<a[2];i++)
                      nums[index++]=2;
        }
};

三路快排:

class Solution {
public:
    void sortColors(vector<int>& nums) {
        int start=-1;//[0...start]都为零
        int end=nums.size();//[end...n-1]都为2
        for(int i=0;i<end;)
        {
            if(nums[i]==1)
                i++;
            else if(nums[i]==2)
                swap(nums[--end],nums[i]);
            else{
                assert(nums[i]==0);
                swap(nums[++start],nums[i++]);
            }
                
            
                
        }
    }
};

全部评论

相关推荐

机械打工仔:我来告诉你原因,是因为sobb有在线简历,有些HR为了快会直接先看在线简历,初步感觉不合适就不会找你要详细的了
投了多少份简历才上岸
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务