题目:
一个数组只有0,1,2,如何把0放首位,1放后面,2放中间
example:
输入:[0, 1, 2, 0, 1, 2]
输出:[0, 0, 2, 2, 1, 1]
解析:
假设,我们有三个指针:p0、p1、p2。p0从左侧开始,指向第一个非0的数字;p1从右侧开始,指向第一个非1的数字。p2从p1开始遍历,如果是2,p2继续遍历,直到p2遇到0或者1:
- 如果遇到0,则和p0进行交换,然后p0向右移动,指向第一个非0的数字
- 如果遇到1,则和p1进行交换,然后p1向左移动,指向第一个非1的数字
代码:
void sort(vector<int> &vec)
{
int len = vec.size();
int p0 = 0;
int p1 = len - 1;
int p2 = 0;
while (p2 <= p1)
{
if (vec[p2] == 2)
++p2;
else if (vec[p2] == 0)
{
swap(vec[p2], vec[p0]);
while (p0 <= p1 && vec[p0] == 0)
++p0;
if (p2 < p0)
p2 = p0;
}
else if (vec[p2] == 1)
{
swap(vec[p2], vec[p1]);
while (p2 <= p1 && vec[p1] == 1)
--p1;
}
}
}
代码2:
解析:
向左扫描所有0,向右扫描所有1,然后将所有2都放在中间。
void sort(vector<int> &vec)
{
int size = nums.size();
if (size <= 1)
return;
int p0 = 0;
int p1 = size - 1;
for (int i = 0; i <= p1; ++i)
{
while (nums[i] == 1 && i < p1) swap(nums[i], nums[p1--]);
while (nums[i] == 0 && i > p0) swap(nums[i], nums[p0++]);
}
}