题目
-
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
-
注意:不能使用代码库中的排序函数来解决这道题。
-
示例:
输入: [2,0,2,1,1,0]
输出: [0,0,1,1,2,2] -
进阶:
一个直观的解决方案是使用计数排序的两趟扫描算法。
首先,迭代计算出0、1 和 2 元素的个数,然后按照0、1、2的排序,重写当前数组。
你能想出一个仅使用常数空间的一趟扫描算法吗?
解题思路
- 由于只能扫描一遍,将0都放在左边,2都放在右边。想到了用两个指针标记0,2的位置,然后通过交换的方法把所有0放在左边,2放在右边;
- 扫描数组,用两个指针分别指向头尾,left左边为0,如果遍历遇到0,则与left指向位置都数交换;
- 如果遍历遇到1,则i++ 继续遍历,如果遍历到2,则与right位置元素交换。
C++实现代码
class Solution {
public:
void sortColors(vector<int>& nums) {
int len=nums.size();
if(len<=1)return;
int left=0,i=0,right=len-1;
//遍历数组
while(i<=right)
{
if(nums[i]==0)
{
swap(nums[i],nums[left]);
left++;
i++;
}
else if(nums[i]==2)
{
swap(nums[i],nums[right]);
right--;
} else
{
i++;
}
}
}
};