颜色分类:给定一个包含红,白,蓝且长度为 n 的数组,将数组元素进行分类使相同颜色的元素相邻,并按照红、白、蓝的顺序进行排序。
我们可以使用整数 0,1 和 2 分别代表红,白,蓝。
注意事项: 不能使用代码库中的排序函数来解决这个问题。 排序需要在原数组中进行。
样例 :给你数组 [1, 0, 1, 2], 需要将该数组原地排序为 [0, 1, 1, 2]
方法一:常规解决方案(1、迭代数组计算 0,1,2 出现的次数;2、然后依次用 0,1,2 出现的次数去覆盖数组)
1 class Solution { 2 /** 3 * @param nums: A list of integer which is 0, 1 or 2 4 * @return: nothing 5 */ 6 public void sortColors(int[] nums) { 7 if(null == nums || nums.length <= 1) return; 8 int Num0 = 0, Num1 = 0, Num2 = 0; 9 for(int i = 0; i < nums.length; i++) { 10 switch(nums[i]) { 11 case 0: 12 Num0++; 13 break; 14 case 1: 15 Num1++; 16 break; 17 case 2: 18 Num2++; 19 break; 20 default: 21 return; 22 } 23 } 24 for(int i = 0; i < nums.length; i++) { 25 if(i < Num0) { 26 nums[i] = 0; 27 }else if(i >= Num0 && i < Num0+Num1) { 28 nums[i] = 1; 29 }else { 30 nums[i] = 2; 31 } 32 } 33 } 34 }
方法二:题目要求(仅使用常数级额外空间复杂度且只扫描遍历一遍数组的算法)
1 public class Solution { 2 /** 3 * @param nums: A list of integer which is 0, 1 or 2 4 * @return: nothing 5 */ 6 public void sortColors(int[] nums) { 7 int i = 0,I = 0; 8 int r = nums.length-1; 9 int temp; 10 //System.out.printf("r=%d",r); 11 12 for(i=0;i<nums.length-1&&i<r+1;){ 13 if(nums[i]==0){ 14 if(i==I){ 15 i++; 16 } 17 else{ 18 temp=nums[i]; 19 nums[i]=nums[I]; 20 nums[I]=temp; 21 } 22 I++; 23 } 24 else if(nums[i]==2){ 25 temp=nums[i]; 26 nums[i]=nums[r]; 27 nums[r]=temp; 28 r--; 29 } 30 else{ 31 i++; 32 } 33 } 34 } 35 }