第75题:颜色分类

一. 问题描述

给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。

此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。

注意:

不能使用代码库中的排序函数来解决这道题。

示例:

输入: [2,0,2,1,1,0]

输出: [0,0,1,1,2,2]

进阶:

一个直观的解决方案是使用计数排序的两趟扫描算法。

首先,迭代计算出0、1 和 2 元素的个数,然后按照0、1、2的排序,重写当前数组。

你能想出一个仅使用常数空间的一趟扫描算法吗?

二. 解题思路

解题步骤:采用三指针的方法(荷兰国旗问题)。

第一步:pfirst,ppush,plast,首先将pfirst表示0的界限,plast表示2的界限,而ppush则从开头进行移动。

第二步:如果ppush指向的数字为0则跟pfirst互换,pfirst向后移动到O的界限,同理plast同种操作。

第三步:判断ppush是否大于pfirst?是:不变。不是:将ppush=pfirst;

第三步,判断ppush大于plast,是:结束。否:重复步骤二。

三. 执行结果

执行用时 :1 ms, 在所有 java 提交中击败了76.06%的用户

内存消耗 :35.3 MB, 在所有 java 提交中击败了36.15%的用户

四. Java代码

class Solution {
    public void sortColors(int[] nums) {
          int pfirst=0;
            int ppush=pfirst;
            int plast=nums.length-1;
            
            while(ppush<=plast)
            {
                if(pfirst<nums.length&&nums[pfirst]==0)
                {
                    
                    pfirst++;
                    if(pfirst>=ppush)
                    {
                        ppush=pfirst;
                    }
                    continue;
                }
                
                if(plast>=0&&nums[plast]==2)
                {
                    plast--;
                    continue;
                }
                
                if(nums[ppush]==0)
                {
                    nums[ppush]=nums[pfirst];
                    nums[pfirst]=0;
                }
                if(nums[ppush]==2)
                {
                    nums[ppush]=nums[plast];
                    nums[plast]=2;
                }
                
                if(nums[ppush]!=2&&nums[ppush]!=0)
                {
                    ppush++;
                }        
            }
    }
}

猜你喜欢

转载自www.cnblogs.com/xiaobaidashu/p/11714598.html