给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
注意:
不能使用代码库中的排序函数来解决这道题。
示例:
输入: [2,0,2,1,1,0]
输出: [0,0,1,1,2,2]
第一个思路
它是两次循环
第一次循环 吧所有0 1 2的所有元素都统计出来
第二次 依次循环出 0 1 2的全部元素
时间复杂度O(n)
空间复杂度O(k),k为范围的元素
package com.binglian.array;
public class LK_75 {
//循环两次
//第一次是把所有的都统计出了0 1 2所有的个数
//第二次 先把0所有循环出来 1一样 2依次
public void sortColors(int[] nums) {
int[] count={0,0,0};//存放0,1,2三个元素
for(int i=0;i<nums.length;i++){
assert nums[i] >=0 && nums[i] <=2;
count[nums[i]]++;
}
int index=0;
for(int i=0;i<count[0];i++){
nums[index++]=0;
}
for(int i=0;i<count[1];i++){
nums[index++]=1;
}
for(int i=0;i<count[2];i++){
nums[index++]=2;
}
}
public static void printArr(int[] nums){
for(int num:nums)
System.out.print(num+" ");
System.out.println();
}
public static void main(String[] args){
int[] nums={2,2,2,1,1,0};
(new LK_75()).sortColors(nums);
printArr(nums);
}
}
第二个思路
三排 快排的思路
三种情况
这里就是 0 1 2三种情况
i的位置出现的位置和two进行交换位置 two--
如果出现0 一样的 zero++
package com.binglian.array;
public class LK_75 {
public void sortColors(int[] nums) {
int zero=-1; //[0...zero]==0
int two=nums.length; //[two...n-1]==2
for(int i=0;i<two;){
if(nums[i]==1)
i++;
else if(nums[i]==2)
swap(nums,i,--two);
else {//nums[i]==0
assert nums[i]==0;
swap(nums,++zero,i++);
}
}
}
private void swap(int[] nums, int i, int j){
int t = nums[i];
nums[i]= nums[j];
nums[j] = t;
}
public static void printArr(int[] nums){
for(int num: nums)
System.out.print(num + " ");
System.out.println();
}
public static void main(String[] args) {
int[] nums = {2, 2, 2, 1, 1, 0};
(new LK_75()).sortColors(nums);
printArr(nums);
}
}