给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
注意:
不能使用代码库中的排序函数来解决这道题
进阶:
- 一个直观的解决方案是使用计数排序的两趟扫描算法。
- 首先,迭代计算出0、1 和 2 元素的个数,然后按照0、1、2的排序,重写当前数组。
- 你能想出一个仅使用常数空间的一趟扫描算法吗?
class Solution {
public void sortColors(int[] nums) {
int l = 0, r = nums.length - 1;
int i = 0;
//因为r是等于数组长度减1,即也是有效的位置,所以循环的条件要加上等于
while (i <= r) {
//如果为0,交换,l和i都加1
if (nums[i] == 0) {
swap(nums, i, l);
l++;
i++;
}
//如果为2,交换,只有r加1(因为不知道r交换过来的是否是0,所以i不动,下次循环再判断一次)
else if (nums[i] == 2) {
swap(nums, i, r);
r--;
}
//如果为1,不变,进入下个循环
else {
i++;
}
}
}
//交换
private void swap(int[] nums, int a, int b) {
int t = nums[a];
nums[a] = nums[b];
nums[b] = t;
}
}
这道题难点在于要原地交换并且只能循环一次,如果不原地交换,而且循环次数不是一次的话,这道题只能是简单。
做到一半后终是有部分地方不对,思路不通,没想到好的解决办法,看题解区后按照liweiwei1419
大佬的思路完成的。