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,大数据面试知识哦~ *