LeetCode75.颜色分类

104 阅读2分钟

LeetCode75.颜色分类

1、题目:

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

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

2、思路

这是一道典型的荷兰国旗题,把国旗按照条纹颜色排好分三块(红,白,蓝)。可以用排序来解决,比如快速排序,但是元素少量重复的情况下还好,如果存在大量重复,partition的时候数组的左半部分可能是空的,然后每次递归都要从右边摘出一个元素去做交换,效率非常差,对快速排序不了解的看一下前文快速排序。 所以排序算法对于大量重复的数而言表现的不尽人意,这个时候可用三指针法,以[0,2,2,1,1,0]举例,我们先划分好左右边界lo,hi指针以及当前指针cur。

此时当前指针元素小于1,说明该元素是属于左边界的值,那就让左边界的后一个元素和该元素交换一下,左边界就多了一个元素,后移占领一位(lo++)。注意,当前指针后移一位(cur++)

此时当前指针元素大于1,说明该元素是属于右边界的值,那就让右边界的前一个元素和该元素交换一下,右边界就多了一个元素,领域多了一个位置,前移占领一位(hi--)。注意当前指针不能向后移,因为交换过来的元素是从后方来的,我们尚未遍历到,所以还要跟1进行对比。

此时指针元素等于1,什么都不用做,当前指针后移即可,直至和hi重合,表示所有元素都已遍历完,颜色分类完毕~

public void sortColors(int[] nums) {
        int lo = -1,hi = nums.length;
        int cur = 0;
        while (cur!=hi){
            if(nums[cur] > 1) {
                swap(nums,cur,--hi);           
            }else if(nums[cur] <= 1){
                if(nums[cur]<1){
                  swap(nums,cur,++lo);
                } 
                cur++;
            }
        }
      
    }

*觉得写的好的,点个攒呗~~ **顺便关注公众号,每天更新算法,java,大数据面试知识哦~ *