荷兰国旗问题

荷兰国旗问题

荷兰国旗问题,或者说黑猫白猫灰猫问题,其实都是一样的,就是说有三类数据乱序排列,然后要求用O(N)的时间复杂度,O(1)的空间复杂度使其有序。因其类似于荷兰国旗,所以被称为荷兰国旗问题(德国、法国在这里表示不服~)。
helanflag

输入

0,1,2,1,2,0,1,1,0,2,1,0,1,2,2,1,0,0

输出

0,0,0,0,0,0,1,1,1,1,1,1,1,2,2,2,2,2

代码解析

排序方法:设置start/end/current三个指针,分别指向开头、开头、结尾。在current<=end的背景下,然后开始判断current的值:
1. 若current==0,因为0要排在前面,所以则将start指向的值和current的值交换,然后start++,current++;

2.若current==1,因为1是排在中间,所以current++,start不变;

3.若current==2,则将current和end的元素交换,将end–,但是current不变,如果current后移1位,那么current这一位就无法判断了。

代码实现

void sorthl(vector<int> &nums)
{
    int len = nums.size();
    int start = 0, current = 0, end = len - 1;
    //在current<=end的背景下,然后开始判断current的值
    while (current <= end)
    {
        //1.若current==0,则将start指向的值和current的值交换,然后start++,current++;
        if (nums[current] == 0)
        {
            swap(nums[current], nums[start]);
            ++current;
            ++start;
        }
        //3.若current==2,则将current和end的元素交换,将end--,但是current不变。
        else if (nums[current] == 2)
        {
            swap(nums[current], nums[end]);
            --end;
        }
        //2.若current==1,则current++,start不变;
        else if (nums[current] == 1)
        {
            ++current;
        }
    }
}

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注