本文最后更新于:2023年3月19日 晚上
Lt75. 颜色分类
给定一个包含红色、白色和蓝色,一共 n *个元素的数组,原地
对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
*注意:**
不能使用代码库中的排序函数来解决这道题。
示例:
输入: [2,0,2,1,1,0]
输出: [0,0,1,1,2,2]
进阶:
- 一个直观的解决方案是使用计数排序的两趟扫描算法。
首先,迭代计算出 0、1 和 2 元素的个数,然后按照 0、1、2 的排序,重写当前数组。
- 你能想出一个仅使用常数空间的一趟扫描算法吗?
思路
计数两次遍历
使用一个数组记录颜色出现个数,再重新修改
双指针
使用左右双指针,将 0 放到前面,将 2 放到后面即可
解答
计数两次遍历
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
var sortColors = function (nums) { const colorCount = [0, 0, 0]; for (let i = 0; i <= nums.length - 1; i++) { colorCount[nums[i]]++; } let count = 0; for (let i = 0; i <= nums.length - 1; i++) { while (colorCount[count] === 0) { count++; } nums[i] = count; colorCount[count]--; } };
|
双指针
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
var sortColors = function (nums) { let left = 0, right = nums.length - 1; for (let i = 0; i <= right; i++) { if (nums[i] === 0) { [nums[left], nums[i]] = [nums[i], nums[left]]; left++; } else if (nums[i] === 2) { [nums[right], nums[i]] = [nums[i], nums[right]]; right--; i--; } } };
|