提供了两种解题思路,方法二算法复杂度为O(n)。
package likou;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
/*
* 颜色分类
* 题干:
* 给定一个包含红色、白色和蓝色,一共 n个元素的数组
* 原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列
* 分别使用整数 0、 1 和 2 分别表示红色、白色和蓝色
* 要求:
* 使用常数空间的算法
*/
public class Demo75 {
/*
* 解题思路一:
* 1.定义一个map数组,key为1、2、3,分别表示三种颜色,value为出现的次数
* 2.遍历nums数字后再遍历map集合即可
*/
public void sortColors(int[] nums) {
int length = nums.length;
Map<Integer,Integer> map = new HashMap();
for(int i=0;i<length;i++) {
int value = nums[i];
if(map.containsKey(value)) {
map.put(value, map.get(value)+1);
}else {
map.put(value, 1);
}
}
int value0 = map.getOrDefault(0, 0);
int value1 = map.getOrDefault(1, 0);
int value2 = map.getOrDefault(2, 0);
for(int t1 = 0;t1<value0;t1++) {
nums[t1] = 0;
}
for(int t2=value0;t2<value1+value0;t2++) {
nums[t2] = 1;
}
for(int t3=value1+value0;t3<value0+value1+value2;t3++) {
nums[t3] = 2;
}
}
/*
* 解题思路二:
* 1.定义一个指针ptr,从0开始
* 2.从0开始遍历,如果遇到某一个nums[i]=0,则将nums[i] 和 nums[ptr]换位置,并将ptr +=1
* 遍历完成之后ptr左边全部都是0了,再从ptr开始遍历,以此类推将1全部摆正位置
* 2.剩下的将全部都是2
*/
public void sortColorsNew(int[] nums) {
int n = nums.length;
int ptr = 0;
for (int i = 0; i < n; ++i) {
if (nums[i] == 0) {
int temp = nums[i];
nums[i] = nums[ptr];
nums[ptr] = temp;
++ptr;
}
}
for (int i = ptr; i < n; ++i) {
if (nums[i] == 1) {
int temp = nums[i];
nums[i] = nums[ptr];
nums[ptr] = temp;
++ptr;
}
}
}
public static void main(String args[]) {
Demo75 demo = new Demo75();
int[] nums = {0};
demo.sortColors(nums);
System.out.println(Arrays.toString(nums));
}
}