给定一个包含红色、白色和蓝色,一共 n
个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0
、 1
和 2
分别表示红色、白色和蓝色。
思路:利用双指针的形式,左边的指针为0和1的分界线索引,右边的指针为1和2的分界线索引,然后依次对数组元素排序,小于1的元素放指针L的左边,大于1的元素放在指针 r 的右边,并相应移动指针位置。
class Solution {
public:
void sortColors(vector<int>& nums) {
int l = 0; //l,r为0,1,2的分界线
int r = nums.size(); //[0,l)为0,[l,r)为1,[l,nums.size())为2
for(int i = 0; i < r; ){ //到达右边界时结束
if(nums[i] == 0){
swap(nums[i],nums[l++]); //互换位置,l右移
i++;
}
else if(nums[i] == 1){
i++;
}
else{
assert(nums[i] == 2);
swap(nums[i], nums[--r]); //互换位置,r左移
}
}
}
};