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++]);
            }
                
            
                
        }
    }
};

猜你喜欢

转载自blog.csdn.net/qq_34691713/article/details/80258002
今日推荐