Given an array with n objects colored red, white or blue, sort them 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.
将数组中的0,1,2分别排序,使得相同的数字相邻,这个比较简单,直接看代码:
1 class Solution { 2 public: 3 void sortColors(vector<int>& nums) { 4 int redNum = count(nums.begin(), nums.end(), 0); 5 int whiteNum = count(nums.begin(), nums.end(), 1); 6 int blueNum = count(nums.begin(), nums.end(), 2); 7 int sz = nums.size(); 8 vector<int> ret(sz, 0); 9 int redCount = 0, whiteCount = 0, blueCount = 0 ; 10 for(int i = 0; i < sz; ++i){ 11 if(nums[i] == 0){ 12 ret[redCount++] = 0; 13 }else if(nums[i] == 1){ 14 ret[whiteCount + redNum] = 1; 15 whiteCount++; 16 }else{ 17 ret[blueCount + redNum + whiteNum] = 2; 18 blueCount++; 19 } 20 } 21 nums = ret; 22 } 23 };
当时题目要求的事one-pass,const-space algorithm,当时硬是没想出来,现在看了下别人的解答,真简洁,原理很简单,3指针,画个图就能看懂了,代码如下所示:
1 public class Solution { 2 public void sortColors(int[] nums) { 3 int i = 0; 4 int j = nums.length - 1; 5 int k = nums.length - 1; 6 while(i <= j){ 7 if(nums[i] == 2){ 8 int tmp = nums[k]; 9 nums[k] = nums[i]; 10 nums[i] = tmp; 11 k--; 12 if(k < j) 13 j = k; 14 }else if(nums[i] == 1){ 15 int tmp = nums[j]; 16 nums[j] = nums[i]; 17 nums[i] = tmp; 18 j--; 19 }else{ 20 i++; 21 } 22 } 23 } 24 }