给定一个包含红色、白色和蓝色,一共 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大佬的思路完成的。
