75. 颜色分类

    科技2024-06-29  68

    75. 颜色分类

    给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。

    此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。

    注意: 不能使用代码库中的排序函数来解决这道题。

    示例:

    输入: [2,0,2,1,1,0] 输出: [0,0,1,1,2,2]

    进阶:

    一个直观的解决方案是使用计数排序的两趟扫描算法。首先,迭代计算出0、1 和 2 元素的个数,然后按照0、1、2的排序,重写当前数组。你能想出一个仅使用常数空间的一趟扫描算法吗? class Solution { public void sortColors(int[] nums) { int r = 0; int w = 0; for (int i = 0; i < nums.length; ++i) { if (0 == nums[i]) { ++r; } if (1 == nums[i]) { ++w; } } for (int i = 0; i < r; ++i) nums[i] = 0; for (int i = r; i < r + w; ++i) nums[i] = 1; for (int i = r + w; i < nums.length; ++i) nums[i] = 2; } } class Solution { public void sortColors(int[] nums) { if (nums == null || nums.length == 0) return; //left控制0最后出现的位置,right控制1最开始出现的位置(倒序) int left = 0; int right = nums.length - 1; int index = 0; while (index <= right) { if(nums[index] == 0) { swap(nums, index++, left++);//原地交换 } else if(nums[index] == 1) { index++;//不动 } else { swap(nums, index, right--);// } } } public void swap(int[] nums, int i, int j) { int temp = nums[i]; nums[i] = nums[j]; nums[j] = temp; } }
    Processed: 0.010, SQL: 8