[LeetCode]Sort Colors

来源:互联网 发布:证券开户数据 编辑:程序博客网 时间:2024/05/18 01:38

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.

Note:
You are not suppose to use the library’s sort function for this problem.

Follow up:
A rather straight forward solution is a two-pass algorithm using counting sort.
First, iterate the array counting number of 0’s, 1’s, and 2’s, then overwrite array with total number of 0’s, then 1’s and followed by 2’s.

Could you come up with an one-pass algorithm using only constant space?


本题难度Medium。

交换法

【复杂度】
时间 O(N) 空间 O(1)

【思路】
有个简单的方法,在follow up已经说了:分别计算出0、1、2的个数,然后对nums重新赋值。不过它要跑两趟(two-pass algorithm)。如何一趟搞定?

我们用三个指针:left、i、right。left是0的边界(left所在的元素可以为0也可以不为0),i为待处理元素,right是2的边界(同理,right所在的元素可以为2也可以不为2)。对于num[i]的处理:

  1. num[i]==1,不进行交换,i++
  2. num[i]==0,swap(left,i),left++,i++
  3. num[i]==2,swap(right,i),right–

简而言之,就是把 0 往前扔,把 2 往后扔即可。

【附】

【注意】
i要从0开始而不能从1开始,否则对于:

nums=[2 1]

会失败。

【代码】

public class Solution {    public void sortColors(int[] nums) {        //require        int size=nums.length;        int left=0,right=size-1;        //invariant        int i=0;        while(i<=right){            if(nums[i]==0){                    swap(left++,i,nums);                    i++;            }else if(nums[i]==2){                swap(right--,i,nums);            }else{                i++;            }        }    }    private void swap(int i,int j,int[] nums){        int tmp=nums[i];        nums[i]=nums[j];        nums[j]=tmp;    }}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 宝宝发高烧怎么办能快速退烧 屁股上长了纹路怎么办 手机充电头歪了怎么办 屁股挠烂了化脓怎么办 手机充电那坏了怎么办 孩子在学校被老师冤枉怎么办 初中学校不好我该怎么办 天气太热屁股淹了怎么办 骑车骑的屁股疼怎么办 爬山时屁股摔紫青了怎么办 宝宝不肯脱裤子拉粑粑怎么办 国家对无地农民怎么办 生完孩子骨架变大怎么办 17岁长高很慢怎么办? 出月子腿着凉了怎么办 脚着凉了脚疼怎么办 腿着凉了特别疼怎么办 孩子骨龄大2两年怎么办 和人吃饭很尴尬怎么办 头不自觉向右偏怎么办 靠墙站立腰疼怎么办 小腿酸痛乏力肌肉萎缩怎么办 搬重物后手臂疼怎么办 和尚鹦鹉吃了盐怎么办 刚买鹦鹉不上手怎么办 word的文件时间改了怎么办 图强gps编码丢失怎么办 武统台湾后岛民怎么办 没有你我怎么办是什么歌 ios 12软件闪退怎么办 来大姨妈想吐怎么办 3岁宝宝体重轻怎么办 硕士延期毕业考上博士怎么办 中国人移民欧洲饮食不习惯怎么办 出车祸了报警警察不管怎么办 高中的孩子不好好上学怎么办 和老公消费观念不合拍怎么办 去医院没带现金怎么办 微信读书下架了怎么办 24岁血压有点高怎么办 吃鸡鼠标弹出来怎么办