思路1:不考虑特殊情况,直接用常规的各种排序算法当然也是可以的
class Solution {
public:
void sortColors(vector<int>& nums) {
sort(nums.begin(),nums.end());
}
};
思路2:元素的数量有限,可以统计各种元素的个数即可
class Solution {
public:
void sortColors(vector<int>& nums) {
int count[3]={0};
for(int i=0;i<nums.size();i++){
count[nums[i]]++;
}
int index = 0;
for(int i=0;i<count[0];i++){
nums[index++]=0;
}
for(int i=0;i<count[1];i++){
nums[index++] = 1;
}
for(int i=0;i<count[2];i++)
nums[index++] = 2;
}
};
思路3:上述方法扫描了数组两次。改进:三路快排
class Solution {
public:
void sortColors(vector<int>& nums) {
int zero=-1; //nums[0...zero]==0
int two=nums.size(); //nums[two...n-1]==2;
for(int i=0;i<two;){
if(nums[i]==1)
i++;
else if(nums[i]==2){
two --;
swap(nums[i],nums[two]);
}
else //nums[i]==0
{
zero++;
swap(nums[zero],nums[i]);
i++;
}
}
}
};