Given an array with n objects colored red, white or blue, sort them in-place so that objects of the same color are adjacent, with the colors in the order red, white and blue.
Here, we will use the integers 0, 1, and 2 to represent the color red, white, and blue respectively.
Note: You are not suppose to use the library's sort function for this problem.
Example:
Input: [2,0,2,1,1,0] Output: [0,0,1,1,2,2]
Follow up:
- A rather straight forward solution is a two-pass algorithm using counting sort.
First, iterate the array counting number of 0's, 1's, and 2's, then overwrite array with total number of 0's, then 1's and followed by 2's. - Could you come up with a one-pass algorithm using only constant space?
-
1 class Solution { 2 public void swap(int []nums, int l, int r) { 3 int temp = nums[l]; 4 nums[l] = nums[r]; 5 nums[r] = temp; 6 } 7 public void sortColors(int[] nums) { 8 int n = nums.length; 9 int l = 0, r = n - 1; 10 int i = 0; 11 while (i >= l && i <= r && l <= r) { 12 while (l <= r && nums[l] == 0) l++; 13 while (l <= r && nums[r] == 2) r--; 14 if (l > r) break; 15 i = Math.max(i, l); 16 if (nums[i] == 2) { 17 swap(nums, i, r--); 18 } else if (nums[i] == 0) { 19 swap(nums, i, l++); 20 } else { 21 i++; 22 } 23 24 25 } 26 27 } 28 }