您的位置:首页 > 其它

lintcode刷题——颜色分类

2017-09-08 09:39 155 查看
原题如下:


颜色分类 

 描述
 笔记

 数据

 评测

给定一个包含红,白,蓝且长度为 n 的数组,将数组元素进行分类使相同颜色的元素相邻,并按照红、白、蓝的顺序进行排序。
我们可以使用整数 0,1 和 2 分别代表红,白,蓝。


 注意事项


不能使用代码库中的排序函数来解决这个问题。

排序需要在原数组中进行。

您在真实的面试中是否遇到过这个题? 

Yes

样例

给你数组 
[1, 0, 1, 2]
, 需要将该数组原地排序为 
[0,
1, 1, 2]


做题思路:

1、只有三个数字0,1,2,所以只需要考虑把0全部放在左边,把2全部放在右边即可;

2、用两根指针,用类似快速排序的算法来做,如果当前的数是0,且下标不为左边的指针所指的位置,交换,同理,如果当前的值为2,下标不为右边的指针所指的位置,交换,否则,继续向前搜索。

具体的C++代码如下:

class Solution{

public:

    /**

     * @param nums: A list of integer which is 0, 1 or 2 

     * @return: nothing

     */    

    void sortColors(vector<int> &nums) {

        // write your code here

        int l=0;

        int r=nums.size()-1;

        int len=nums.size();

        for(int i=0;i<min(len,r+1);)

        {

            if(nums[i]==0)

            {

                if(i==l)

                {

                    i++;

                }

                else

                {

                    swap(nums[i],nums[l]);

                    l++;

                }

            }

            else if(nums[i]==2)

            {

                swap(nums[i],nums[r]);

                r--;

            }

            else

            {

                i++;

            }

        }

    }

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: