75.颜色分类

给定一个包含红色、白色和蓝色,一共 n个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
进阶:
-你可以不使用代码库中的排序函数来解决这道题吗?
-你能想出一个仅使用常数空间的一趟扫描算法吗?
输入:nums = [2,0,2,1,1,0]
输出:[0,0,1,1,2,2]

思路:
简单的,首先在首位设置双指针,然后另外准备一个cur从头到尾遍历数组,如果是0,就扔到前面的左指针处,然后left++,如果是2就扔到右指针处,right--;但是这样写是错误的,首先因为从cur[left]交换的过来的数字不可能是0,因为如果是0应该早就安排了,只能是1或者2,1是可以接受的,2是不可以接受的,因为2本应该放后面;然后cur[right]换过来cur的数字可能是0,1,2,0和2都不能接受,按理来说都应该再处理,但是仅需让cur[right]和cur交换完之后,cur不移动即可解决上述问题,因为,换过不管是0或者2都可以处理了,这样同时也保证了cur前面不可能出现2(假设出现一定会被扔后面,来一个2扔一个),所以cur[left]的交换也无序特殊处理了。
比如[1,2,0],cur=0的时候do nothing,cur=1,遇到2往最后交换,变成[1,0,2],此时cur不++,继续处理0,和最左边交换,得出[0,1,2]

代码:(swap略)

 public void sortColors(int[] nums) {
        int left = 0;
        int right = nums.length-1;
        int mid = 0;
        while(mid<=right){//碰到2区就要停下来了
            if(nums[mid]==0){
                swap(nums,mid,left);
                left++; //0区后移
            }else if(nums[mid]==2){
                swap(nums,mid,right);
                right--; //2区前移
                mid--; //最关键部分,后面的数交换过来,万一是
            }else{
                //do nothing
            }
            mid++;
        }
    }

你可能感兴趣的:(75.颜色分类)