- 计数排序,记下0,1,2的个数,然后在赋值给vector。这样数组循环了两遍不符合题意
class Solution {
public:
void sortColors(vector<int>& nums) {
int a = 0, b = 0, c = 0;
for(int i=0; i<nums.size(); ++ i)
{
if(nums[i] == 0)
a ++;
else if(nums[i] == 1)
b ++;
else
c ++;
}
int i=0;
for(i=0; i<a; ++ i)
nums[i] = 0;
b = a + b;
for(; i<b; ++ i)
nums[i] = 1;
c = b + c;
for(; i<c; ++ i)
nums[i] = 2;
}
};
- 用两个数分别记录0的结束位置和2的起始位置,循环过程中交换。不过代码好像写挫了,时间反而比计数排序还慢。
class Solution {
public:
void sortColors(vector<int>& nums) {
int b = 0, e = nums.size() - 1;
int l = b, r = e;
while(b <= e)
{
if(nums[b] == 0)
{
if(b == l)
b ++;
else
swap(nums[b], nums[l]);
l++;
}
else if(nums[b] == 1)
b ++;
else if(nums[b] == 2)
{
swap(nums[b], nums[r]);
if(r == e)
e --;
r --;
}
else if(nums[e] == 0)
{
swap(nums[l], nums[e]);
if(l == b)
b ++;
l ++;
}
else if(nums[e] == 1)
e --;
else
{
if(e == r)
e --, r --;
else
swap(nums[e], nums[r]);
r --;
}
}
}
};
class Solution
{
public:
void sortColors(vector<int>& nums)
{
int b = 0, e = nums.size()-1;
for(int i=0; i<=e; ++ i)
{
if(nums[i] == 0)
swap(nums[i], nums[b ++]);
else if(nums[i] == 2)
swap(nums[i --], nums[e --]);
}
}
};