leetcode-75.颜色分类
题目详情
给定一个包含红色、白色和蓝色、共 n
个元素的数组 nums
,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
我们使用整数 0、 1 和 2
分别表示红色、白色和蓝色。
必须在不使用库的sort函数的情况下解决这个问题。
示例1:
输入:nums = [2,0,2,1,1,0]
输出:[0,0,1,1,2,2]
示例2:
输入:nums = [2,0,1]
输出:[0,1,2]
我的方法:
利用三个指针来进行一次遍历排序,一个头用来存0,一个尾用来存2,一个遍历
如果遍历到0,则与头交换,2,则与尾交换,否则继续遍历
但是需要注意的是,和尾交换后可能交换过来的还是0或者2,所以这里需要再分两种情况
详情代码:
class Solution
{
public:
void sortColors(vector<int>& nums)
{ int n = nums.size();
if (n < 2)
return;
//三个指针zero头区间,two尾区间,p正在遍历区间
int zero = 0,two = n - 1,p = 0;
while(p <= two)
{
if (nums[p] == 0) //遍历到若是0,则和头交换
{
swap (nums[p] , nums[zero]);
++zero;
++p;
}
else if (nums[p] == 2) //遍历到若是2,则和尾交换
{
if (nums[two] == 1) //这里必须注意,如果交换过来的是1,则不考虑其他
{
swap (nums[p] , nums[two]);
++p;
--two;
}
else //但若是交换过来是0或者2,则不应往下遍历
{ //因为0 2还需继续处理
swap (nums[p],nums[two]);
--two;
}
}
else //遍历到1,直接略过继续遍历即可
{
++p;
}
}
}
};