Leetcode:颜色分类(0,1,2还顺序排序)

题目 

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

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

来源:力扣(LeetCode)

解法 

本题是经典的「荷兰国旗问题」,由计算机科学家 Edsger W. Dijkstra 首先提出。

解法较多,本解法时间复杂度是O(N),空间复杂度为O(1)

定义两个指针:p0,p1
指针移动规则
规则1:
p0 <= p1;
规则2:
p0 < p1时,先交换p0和i,再交换p1和i
规则3:
p0 = p1时,p0移动,p1也要移动
规则4:
每次交换指针都要移动一次,不用立即移动,但必须在下次开始前移动。
规则5:
指针比较大小应在本次行动之前比较

void swap(int *nums, int i, int j)
{
    int tmp = nums[i];
    nums[i] = nums[j];
    nums[j] = tmp;
}


void sortColors(int* nums, int numsSize){
    //用两个指针,一个查看2,一个查看0,
    //找到0,1和左右换位置
    //不能对我以扫描过的区域再进行改动

    int p0 = 0;
    int p1 = 0;
    for(int  i = 0; i < numsSize; i++)
    {
        printf("p0:%d p1:%d\n",p0,p1);
        if(nums[i] == 0)
        {
            swap(nums, i, p0);
            //规则5
            if(p0 < p1)
            {
                swap(nums, i, p1);
                p1++;
            }
            //规则4:
            p0++;
            //规则3
            if(p1 <= p0)
                p1++;
        }
        else if(nums[i] == 1)
        {
            swap(nums, i, p1);
            p1++;
        }
    }
}

作者:he-si-yuan-w
链接:https://leetcode-cn.com/problems/sort-colors/solution/shuang-zhi-zhen-ti-qu-shu-zu-zhong-de-li-nb28/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值