题目:给定一个包含红,白,蓝且长度为 n 的数组,将数组元素进行分类使相同颜色的元素相邻,并按照红、白、蓝的顺序进行排序。
我们可以使用整数 0,1 和 2 分别代表红,白,蓝。
挑战:一个相当直接的解决方案是使用计数排序扫描2遍的算法。首先,迭代数组计算 0,1,2 出现的次数,然后依次用 0,1,2 出现的次数去覆盖数组。
你否能想出一个仅使用常数级额外空间复杂度且只扫描遍历一遍数组的算法?
我的思路:扫描一遍,扫描到0时往前面放,扫描到2时往后面放,分别用两个变量记住首端0和末尾2的位置。
代码:
class Solution{
public:
/**
* @param nums: A list of integer which is 0, 1 or 2
* @return: nothing
*/
void sortColors(vector<int> &nums) {
// write your code here
int pos0 = 0;
int pos2 = nums.size()-1;
for (int i = 0; i < nums.size()-1; i++) {
if (nums[i] == 2) {
while(nums[pos2] == 2)
pos2--;
if (i < pos2)
swap(nums[pos2], nums[i]);
pos2--;
}
if (nums[i] == 0) {
if ( i > pos0)
swap(nums[pos0], nums[i]);
pos0++;
}
}
}
};