题目描述:
给定一个包含红色、白色和蓝色,一共n个元素组成的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数0,1,2分别表示红,白,蓝。
题目解析:
本题可以直接计算出数组中0,1,2的数字个数,然后再进行排列组合。但题目要求我们使用常数空间的一趟扫描算法,于是我们采用“三路归并”的荷兰旗问题解决方案。
具体为:设置三个指针,分别为p0,cur,p2,分别用来指向0值元素,当前元素,2值元素。首先令p0指向数组第一个元素,p2指向最后一个元素,然后分别计算nums[cur]的值,如果nums[cur]==0,则 和nums[p0]进行交换,并且p0++,cur++,如果nums[cur]==2 则和nums[p2]的值进行交换,p2--,其余情况则cur++
具体代码实现:
class Solution{
public:
void sortColors(vector<int>& nums)
{
int p0=-1, cur = 0, p2 = nums.size();
while(cur<p2)
{
if(nums[cur]==0)
swap(nums[++p0],nums[cur++]);
else if(nums[cur]==1)
cur++;
else
swap(nums[cur],nums[--p2]);
}
}
};