题目翻译:
给定一个具有N个元素的数组,且数组只存在三种值0,1,2,分别代表红色,白色或蓝色。现在对其排序,使得相同颜色的物体是相邻的,要求顺序为红、白、蓝。
提醒
你是不是想利用图书馆的排序解决这个问题。
更进一步:
一个相当简单的解决方案是使用计数排序算法。
首先,迭代数组统计0的,1的,2的个数,然后将0覆盖指定个数的到数组,然后1,其次是2。
你能想出一个一次遍历的算法,并且使用常数空间复杂度?
分析:DONE
这就是题目中所说的“相当直接的解法”。即统计0,1,2的个数,然后覆盖一遍!
class Solution {
public:
void sortColors(vector<int>& nums) {
int cntRed=0;
int cntWhite=0;
for(int i=0;i<nums.size();i++)
{
if(nums[i]==0)
cntRed++;
else if(nums[i]==1)
cntWhite++;
}
int cntBlue=nums.size()-cntRed-cntWhite;
int cnt=0;
while(cntRed--)
nums[cnt++]=0;
while(cntWhite--)
nums[cnt++]=1;
while(cntBlue--)
nums[cnt++]=2;
}
};
别人的算法1:
核心思想:把0和2往两边挪动,中间留下1即可
class Solution {
public:
void sortColors(vector<int>& nums) {
int second=nums.size()-1, zero=0;
for (int i=0; i<=second; i++) {
while (nums[i]==2 && i<second)
swap(nums[i], nums[second--]);//把2往右边赶
while (nums[i]==0 && i>zero)
swap(nums[i], nums[zero++]);//把0往左边赶
}
}
};
注:本博文为EbowTang原创,后续可能继续更新本文。如果转载,请务必复制本条信息!
原文地址:http://blog.csdn.net/ebowtang/article/details/51660958
原作者博客:http://blog.csdn.net/ebowtang
本博客LeetCode题解索引:http://blog.csdn.net/ebowtang/article/details/50668895