Leetcode - 75. Sort Colors - Dutch national flag problem - Partition

1.Question:

Given an array with n objects colored red, white or blue, sort them so that objects of the same color are adjacent, with the colors in the order red, white and blue.

Here, we will use the integers 0, 1, and 2 to represent the color red, white, and blue respectively.

翻译:
给你一个n长度的序列,序列中的元素只有红,白,蓝三种,对这个序列进行排序是的相同颜色的元素是邻近的,并且整体上有红,白,蓝的顺序
这里我们定义0代表红色,1代表白色,2代表蓝色
请用尽可能高效的解法给出解答

2.Solution:

本题是标准的Dutch nation flag problem问题,荷兰三色旗问题我们的解决途径是很显然的
对于朴素的方法来说,我们可以扫描一遍然后计数最后我们对数组进行重新赋值就好,需要的时间复杂度是O(n),但是常数时间的因子不是很完美
本题的标准解法是利用Partition函数(详见快速排序)下设三个指针域从而实现一遍扫描O(n)解决,空间复杂度是O(1)高效的解决这个问题

算法的原理如下:
1.初始化:0指针索引是-1,1指针索引是0,2指针索引是数组的长度(注意是长度,下表从0开始)
2.首先,我们先给出意义:
0,1(开区间)指针之间的区域全部都是1
数组首地址到0指针之间全部都是0
2指针到数组的尾地址之间全都是2
1-2(前闭后开)指针之间都是待检查的区域
3.对于每次的1指针
如果是1,忽略
如果是0,我们令0指针递增并交换
如果是2,我们令2指针递减至第一个非2元素并交换
4.当1指针和2指针指向相同,程序结束,完成交换

3.Code:

void sortColors(int* nums, int numsSize) {
    int i=-1;
    int j=0;
    int k=numsSize;
    while(j<k)
    {
        if(nums[j]==0)
        {
            i++;
            int temp=nums[i];
            nums[i]=nums[j];
            nums[j]=temp;
        }
        else if(nums[j]==2)
        {
            k--;
            while(j<k&&nums[k]==2) k--;
            int temp=nums[j];
            nums[j]=nums[k];
            nums[k]=temp;
            if(nums[j]==0)
            {
                i++;
                int temp=nums[i];
                nums[i]=nums[j];
                nums[j]=temp;
            }
        }
        j++;
    }
}
Submission Result: Accepted


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值