LeetCode HOT 100:颜色分类(荷兰国旗问题)
题目:75. 颜色分类
题目描述:
给你一个数组,元素只为0、1、2
,分别代表红色、白色和蓝色。将数组中相同颜色的元素移动到一起,并将它们排序。也就是将0
都排在最前面,1
排在中间,2
排在最后。题目要求不申请额外空间,原地移动。
思路:
这道题的思路很清晰,就是荷兰国旗问题。用解荷兰国旗问题的方法解这道题就行。那么荷兰国旗问题如何解呢?设置两个指针,分别命名为less
,more
。less
指针代表[0...less]
区域都是小于某个值的,more
指针代表[more...数组长度 - 1]
区域都是大于某个值的。这样,中间部分一定就是等于某个值的。最终就将数组划分为三块区域了。
那么指针该如何移动呢?如果当前遍历到的元素小于某个值,就将less++
,然后将less
和当前下标交换,如果大于某个值,就将more--
,然后将more
和当前下标交换,相等就接着遍历下一个,不用交换。一直遍历到more
下标结束。因为more
后面的元素都是大于某个值的了,所以不用再遍历了。
步骤:
1、设置less
,more
指针并初始化
2、按照规则,移动两个指针,并元素交换
3、返回数组
代码:
public void sortColors(int[] nums) {
partition(nums, 0, nums.length - 1, 1);
}
// 将数组[L...R]范围,划分为 <val, =val, >val 三个区域
public void partition(int[] nums, int L, int R, int val) {
int less = L - 1;
int more = R + 1;
int index = L;
while (index < more) {
if (nums[index] == val) {
index++;
} else if (nums[index] < val) {
less++;
swap(nums, less, index);
index++;
} else {
more--;
swap(nums, index, more);
}
}
}
public void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}