题目详情:
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
示例 1:
输入:nums = [2,0,2,1,1,0] 输出:[0,0,1,1,2,2]
示例 2:
输入:nums = [2,0,1] 输出:[0,1,2]
示例 3:
输入:nums = [0] 输出:[0]
示例 4:
输入:nums = [1] 输出:[1]
提示:
-
n == nums.length
-
1 <= n <= 300
-
nums[i]
为0
、1
或2
解题思路:
使用对撞指针把所有0置换到数组的最前面,然后在左指针不变的情况下,将右指针重新移到数组最右侧,因为此时左指针的左侧已经全部都是0了(没有0的话则左指针还是在数组最左侧),再对撞一次,此时将1全部置换至左边。
代码实现:
void sortColors(int* nums, int numsSize) {
int *q = nums, *p = nums + numsSize - 1;//设置对撞指针
int temp;
while (q < p) {
if (*q == 0) q++;//当左指针为0时,左指针右移
else if (*p == 0) {//当左指针指向的值不为0,而右指针指向的值为0,则置换值
temp = *q;
*q = *p;
*p = temp;
q++;
p--;
} else p--;
}
if (*q == 0) q++;//这个时候左指针的左边都为0了,但左指针指向的值有可能为0,如果没有这一步,则可能会出现后面发生0和1置换的情况
p = nums + numsSize - 1;//重置右指针
while (q < p) {//同上
if (*q == 1) q++;
else if (*p == 1) {
temp = *q;
*q = *p;
*p = temp;
q++;
p--;
} else p--;
}
}