LintCode_颜色分类

来源:互联网 发布:js 获取event对象 编辑:程序博客网 时间:2024/06/05 09:50

问题描述:


算法描述:

根据上面的说明,我设计了两种算法,第一种遍历两次,第二种只遍历一次

方法一:

    public static void sortColors1(int[] nums) {                if(nums!=null&&nums.length!=0){                        int size=nums.length;            int[] count=new int[3];            int pos=0;                        //统计0,1,2的个数            for(int i=0;i<size;i++){                                if(nums[i]==0){                    count[0]++;                }else if(nums[i]==1){                    count[1]++;                }else if(nums[i]==2){                    count[2]++;                }            }                        //再遍历一次数组,改变nums            for(int j=0;j<count.length;j++){                while(count[j]!=0){                    nums[pos]=j;                    pos++;                    count[j]--;                }            }        }//        for(int k:nums){//            System.out.print(k+" ");//        }    }

方法二:

    public static void sortColors(int[] nums) {        if(nums!=null&&nums.length!=0){                        //记录0和2的位置            int pos=0;            //nums的长度            int size=nums.length;            //记录已检测到的2的个数,这个在将2插入到最后有很大作用,以免陷入死循环            int count2=0;            //起到一个标记作用,主要是在将待插的2后面有0或者2,这样当后面的数往前移一位了,但i++,这样可能跳过了移位后待插处的0或者2;            int flag2=0;            for(int i=0;i<size-count2;i++){                if(nums[i]==0){                    pos=i;                    while(pos>0){                        //遇到0,则把0前面的数往后移,然后将0插入到数组第一个                        nums[pos]=nums[pos-1];                        pos--;                    }                    nums[pos]=0;                }else if(nums[i]==2){                    pos=i;                    count2++;                    flag2=2;                    while(pos<size-1){                      //遇到2,则把2后面的数往后移,然后将2插入到数组最后一个                        nums[pos]=nums[pos+1];                        pos++;                    }                    nums[pos]=2;                }                                if(flag2==2&&(nums[i]==0||nums[i]==2)&&i<size-count2){                    i--;                    flag2=0;                }            }        }    }




0 0
原创粉丝点击