• 三色排序


    题目大意:

    给你红,白,蓝三种颜色的数组,要求按照红、白、蓝的顺序排序,leetcode链接:https://leetcode.com/problems/sort-colors/

    思路1:

    直接给整个数组排序,时间复杂度O(nlogn)

    思路2:

    计数排序方法,使用一个类似hash的数组纪录每种颜色的个数,然后进行排序,但是需要遍历原数组两遍

    思路3:

    使用三个指针,p1表示红色和白色的分界线,p2表示白色和蓝色的分界线,i表示当前元素

    即0~p1-1是红色的,p1~i-1表示白色的,p2+1~n-1表示蓝色的

    1)如果当前元素是红色的,则和p1所指向的元素进行交换,由于交换以后i所指的颜色是白色的,则i直接遍历下一个元素

    2)如果当前元素是蓝色的,则和p2所指向的元素进行交换,由于交换以后i所指的颜色可能是白色的,也可能是红色的,因此需要回退i

    实现代码如下:注意i应该在[p1,p2]之间

    class Solution
    
    {
    
    public:
    
        void sortColors(vector<int>& nums)
    
        {
    
        int n = nums.size();
    
        if(n <= 1)
    
        {
    
        return;
    
        }
    
     
    
        int p1 = 0;
    
        int p2 = n - 1;
    
        // 注意i的循环条件
    
        for(int i=0; i<=p2; ++i)
    
        {
    
        if(nums[i] == 0)
    
        {
    
        swap(nums[p1], nums[i]);
    
        ++p1;
    
        }
    
        else if(nums[i] == 2)
    
        {
    
        swap(nums[p2], nums[i]);
    
        --p2;
    
        --i;
    
        }
    
        }
    
        }
    
    private:
    
        void swap(int &a, int &b)
    
        {
    
        int tmp = a;
    
        a = b;
    
        b = tmp;
    
        }
    
    };

     本题还可以利用hash的方式进行排序,代码如下:

    class Solution
    {
    public:
        void sortColors(vector<int>& nums)
        {
            int n = nums.size();
            vector<int> hash(3, 0);
            for(int i=0; i<n; ++i)
            {
                hash[nums[i]]++;
            }
    
            int index = 0;
            for(int i=0; i<3; ++i)
            {
                for(int j=0; j<hash[i]; ++j)
                {
                    nums[index++] = i;
                }
            }
        }
    };
  • 相关阅读:
    多态及鸭子类型
    面向对象三大特性之——继承
    类的组合
    类的成员和命名空间
    JAVA中常用的类
    JAVA自学笔记(5)
    JAVA自学笔记(4)
    JAVA自学笔记(3)
    JAVA自学笔记(2)
    JAVA自学笔记(1)
  • 原文地址:https://www.cnblogs.com/shirley-ict/p/5164887.html
Copyright © 2020-2023  润新知