原题链接在这里:https://leetcode.com/problems/sort-colors/
Method 1 是bucket sort, 数个数,然后依次排回原数组,会扫两遍数组
Mehod 2 是利用多个指针,指针的个数是不同元素个数-1. 例如本题中有 0 1 2三种数字,就设两个指针。
第一个指针idx0指向最后一个0,第二个指针idx1指向最后一个1,不需要指向最后一个2的指针,它会指向nums[nums.length-1].
每当遇到0时,idx0和idx1都往后移动,每当遇到1时,idx1往后移动。
Note: 移动前A[i]都付值成2,若是要移动idx1, nums[idx1]赋值成1,若是要移动idx0, nums[idx0] 赋值成0, 基本思路就是三个或者两个数之间的swap.
AC Java:
1 public class Solution { 2 public void sortColors(int[] nums) { 3 /* 4 //Method 1 Bucket sort 5 if(nums == null || nums.length == 0){ 6 return; 7 } 8 int [] colorCount = new int[3]; 9 Arrays.fill(colorCount,0); 10 for(int i = 0; i<nums.length; i++){ 11 colorCount[nums[i]]++; 12 } 13 int z = 0; 14 for(int i = 0; i<=2; i++){ 15 while(colorCount[i]>0){ 16 nums[z] = i; 17 z++; 18 colorCount[i]--; 19 } 20 } 21 */ 22 23 //Method 2 24 if(nums == null || nums.length == 0){ 25 return; 26 } 27 int idx0 = 0; 28 int idx1 = 0; 29 for(int i = 0; i<nums.length; i++){ 30 if(nums[i] == 0){ 31 nums[i] = 2; 32 nums[idx1] = 1; 33 nums[idx0] = 0; 34 idx1++; 35 idx0++; 36 }else if(nums[i] == 1){ 37 nums[i] = 2; 38 nums[idx1] = 1; 39 idx1++; 40 } 41 } 42 } 43 }
原文:http://www.cnblogs.com/Dylan-Java-NYC/p/4851697.html