题目
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
注意
不能使用代码库中的排序函数来解决这道题。
示例
输入: [2,0,2,1,1,0]
输出: [0,0,1,1,2,2]
思路
- 用三个指针left, cur,right。left指向首元素,right指向尾元素,cur从首元素开始,进行遍历操作。
- 当cur指向的数等于2的时候。把数字和right指向的数字交换,同时right自减1。此时cur不能自增,因为有可能交换过来的数为0或者2。
- 当cur指向的数等于0的时候。把数字和left指向的数字交换,同时left和cur都进行自增。为什么这里cur能自增,因为cur前面的数字不可能有0和2,因为0都被交换到了前面,2都交换到了后面。
- 当cur指向的数等于1的时候,cur自增。
- 停止条件为cur <= right。之所以等于right,只因为有可能right更新到和cur一样时,此时cur指向的数字是0,要保证0可以被交换到前部分。
代码
class Solution {
public:
void sortColors(vector<int>& nums) {
if ( nums.size() == 0 || nums.size() == 1 )
return;
int left = 0, right = nums.size() - 1;
int cur = 0;
while ( cur <= right ) { // 要有等号,因为[2,0,1]
if ( nums[cur] == 0 ) {
swap( nums[left], nums[cur] );
++left;
++cur;
}
else if ( nums[cur] == 1)
++cur;
else if( nums[cur] == 2 ) {
swap( nums[cur], nums[right] );
--right;
}
}
return;
}
void swap( int& a, int & b ) {
int temp = a;
a = b;
b = temp;
return;
}
};