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

来源:互联网 发布:c语言编译器初学者 编辑:程序博客网 时间:2024/05/01 13:41

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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 被双开后以前的养老保险怎么办 尚赫辟谷期间来月经怎么办 保险公司给代理人奖金迟发怎么办 比亚迪f3烧机油怎么办 支付宝刷脸认证老失败怎么办 融e借没密码器怎么办 融e购不显示积分怎么办 王者荣耀区满了怎么办 苹果4s储存不够怎么办 乐视2费电超级快怎么办 支付宝手机订单号查不到怎么办 淘宝几个订单同一个快递单号怎么办 工商银行u盾丢了怎么办 银行不让开u盾怎么办 手机u盾识别不了怎么办 绿森商城不退款怎么办 电信手机号码过户积分清零怎么办 被电话诈骗骗了怎么办 诈骗电话骗了钱怎么办 被网友骗了一千块钱怎么办 被网友骗了1000块怎么办 微信红包被骗100怎么办 3m投资钱要不回来怎么办 手机照片超过3m怎么办 小说大于3m看不了怎么办 携程订单删除了怎么办 绿叶会员密码忘了怎么办 账号对名错了怎么办 lv双肩包肩带短了怎么办 微信充q币被骗了怎么办 qq隐私密码忘了怎么办 qq锁屏密码忘了怎么办 qq手势密码忘记了怎么办 qq红包的密码忘了怎么办 qq密码被改了怎么办啊 手机qq密码忘了怎么办 腾讯安全中心冻结解冻进不去怎么办 qq钱包充值限额怎么办 qq没绑卡支付密码忘了怎么办 手机qq停止运行该怎么办 手机不支持qq软件运行怎么办