题目
Given an array with n objects colored red, white or blue, sort them in-place so that objects of the same color are adjacent, with the colors in the order red, white and blue.
Here, we will use the integers 0, 1, and 2 to represent the color red, white, and blue respectively.
题意
给定一个数组,里面包含0,1,2三个数组,代表红,白,蓝三种颜色,要求将数字按红白蓝排序,相同颜色相邻。
例子
Input: [2,0,2,1,1,0]
Output: [0,0,1,1,2,2]
题解
直接的做法,就是遍历两遍,第一遍统计012对应的个数,第二遍按012覆盖到原数组。但是题目说可以使用遍历一遍的做法,并且使用常数空间复杂度。
遍历一遍的做法是使用红蓝两个指针,分别指向头尾,当遍历到0时,与红指针交换位置,遍历到2时,与蓝指针交换位置。遍历到1时则继续遍历。
注意细节问题,当与蓝指针交换后,遍历位置应停留在原位,因为我们并不知道从指针位置交换过来的数值是否符合当前位置。所以需要继续判断。
而且当遍历到超过蓝指针时就要结束,不然会把后面的2交换到前面去。
代码
func sortColors(nums []int) {
Len := len(nums)
if Len==0{
return
}
p0,p2:=0,Len-1
for i:=0;i<Len;i++{
if p2<i{ //超过p2就结束
return
}
if nums[i]==0{
temp := nums[i]
nums[i] = nums[p0]
nums[p0]=temp
p0++
}else if nums[i]==2{
temp:=nums[i]
nums[i]=nums[p2]
nums[p2]=temp
p2--
i-- //交换p2,需要对原p2位置继续判断
}
}
}
总结
一开始是有想到用指针来表示对应的颜色,遍历到了便交换到对应的指针位置,只是一开始我设想的是有红白蓝三个指针,红蓝好解决,就是白指针很麻烦。解决不了查了一下发现只要红蓝指针即可,因为白蓝指针从首尾向内移动,所以02会不断的移动到两边,最后1就会被聚拢到中间。
这道题本应该不难解法,但还是花费了挺多时间,而且一开始想到指针的时候方向是对的,但是没反映过来使用两个指针就可以了。
在知道使用两个指针之后,还是疏忽了很多细节问题,比如蓝指针交换过去之后i需要保留原地继续判断,但是交换0就不需要,因为p0指针的位置交换过来只有可能是1,而从p2指针交换过来的可能是012。