当前位置: 面试刷题>> 颜色分类 (经典算法题500道)


### 题目描述补充 题目:**颜色分类** 给定一个包含红色、白色和蓝色,一共 `n` 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色的顺序排列。 这里我们使用整数 `0`、`1` 和 `2` 分别表示红色、白色和蓝色。 **注意**:你不能使用额外的数组空间,并且你只能在原地对数组进行排序,也就是说,你只能修改输入数组。 ### 示例 输入:`[2, 0, 2, 1, 1, 0]` 输出:`[0, 0, 1, 1, 2, 2]` ### 解题思路 可以使用三指针法来解决这个问题。我们设置三个指针: - `p0` 指向当前已经排好序的 `0` 的最后一个位置(初始化为0,因为数组可能从索引0开始就是0)。 - `curr` 遍历数组的当前位置(初始化为0)。 - `p2` 指向当前尚未处理的元素中第一个 `2` 的位置(初始化为数组长度-1,因为数组末尾可能是2)。 遍历数组,根据当前元素的值进行如下操作: - 如果 `nums[curr] == 0`,则与 `nums[p0]` 交换,并同时递增 `p0` 和 `curr`。 - 如果 `nums[curr] == 1`,则只递增 `curr`。 - 如果 `nums[curr] == 2`,则与 `nums[p2]` 交换,但只递减 `p2`(因为交换过来的元素未知,`curr` 需要保持不变以重新检查新交换来的元素)。 ### 示例代码 #### PHP ```php function sortColors(&$nums) { $p0 = 0; $p2 = count($nums) - 1; $curr = 0; while ($curr <= $p2) { if ($nums[$curr] == 0) { list($nums[$curr], $nums[$p0]) = array($nums[$p0], $nums[$curr]); $p0++; $curr++; } elseif ($nums[$curr] == 2) { list($nums[$curr], $nums[$p2]) = array($nums[$p2], $nums[$curr]); $p2--; } else { $curr++; } } } ``` #### Python ```python def sortColors(nums): p0, curr, p2 = 0, 0, len(nums) - 1 while curr <= p2: if nums[curr] == 0: nums[curr], nums[p0] = nums[p0], nums[curr] p0 += 1 curr += 1 elif nums[curr] == 2: nums[curr], nums[p2] = nums[p2], nums[curr] p2 -= 1 else: curr += 1 ``` #### JavaScript ```javascript function sortColors(nums) { let p0 = 0, curr = 0, p2 = nums.length - 1; while (curr <= p2) { if (nums[curr] === 0) { [nums[curr], nums[p0]] = [nums[p0], nums[curr]]; p0++; curr++; } else if (nums[curr] === 2) { [nums[curr], nums[p2]] = [nums[p2], nums[curr]]; p2--; } else { curr++; } } } ``` **码小课**网站中有更多相关内容分享给大家学习,包括算法题解、数据结构、面试技巧等,帮助大家提升编程能力。
推荐面试题