【Leetcode】75.颜色分类

75 颜色分类

题目:
给定一个包含红色、白色和蓝色,一共n个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。

示例:
输入: [2,0,2,1,1,0]
输出: [0,0,1,1,2,2]

直观思路:
两次遍历数组,第一次遍历时记录下红白蓝三色(0、1、2)分别出现的次数,第二次遍历时重写当前数组

只用一次遍历的方法:
同荷兰国旗问题的解决方法类似。方法阐述见代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public void sortColors(int[] nums) {
//red表示红色区域的右边界,blue表示蓝色区域的左边界
//初始化时,红色区域和蓝色区域都不存在
int red = -1;
int blue = nums.length;
//cur为游标,代表遍历到的当前位置
int cur = 0;
//等到cur与blue区域相遇时,跳出循环,遍历结束
while(cur < blue){
//如果当前节点是红色的,交换这个节点与红色区域的下一个节点,红色区域右移一位。
if(nums[cur] == 0)
swap(nums, ++red, cur++);
//如果当前节点是蓝色的,交换这个节点与蓝色区域的前一个节点,蓝色区域左移一位
//当前cur不变,交换过来的cur位置值需要继续进入while循环,判断此处是蓝色白色还是红色
else if(nums[cur] == 2)
swap(nums, --blue, cur);
//如果当前节点是白色的,红色区域和蓝色区域均不变,cur继续右移
else
cur++;
}
}
public void swap(int[] nums, int i, int j){
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}