问题描述:
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?
源码:
题意中不建议的做法,但是不用矩阵。用三个值存着0,1,2的个数。这样可以算是空间复杂度O(1).
class Solution {
public:
void sortColors(vector<int>& nums) {
int zero=0, one=0, two=0;
int n = nums.size();
for(int i=0; i<n; i++){
if(nums[i]==0) zero++;
else if(nums[i]==1) one++;
else two++;
}
int i=0;
for(;i<zero;i++) nums[i] = 0;
for(;i<zero+one;i++) nums[i] = 1;
for(;i<n;i++) nums[i] = 2;
}
};
Discuss里面有个大神,用的方法有点快速排序的思想,很厉害。
class Solution {
public:
void sortColors(vector<int>& nums) {
int left=0, right=nums.size()-1, i=0;
for(i=0; i<right; i++){
if(nums[i]==2){
while(i<right && nums[right]==2) right--;
swap(nums[i], nums[right]);
}
}
for(i=max(0, right); i>left; i--){
if(nums[i]==0){
while(i>left && nums[left]==0) left++;
swap(nums[i], nums[left]);
}
}
}
};