
题目描述
75. 颜色分类
给定一个包含红色、白色和蓝色、共 n
个元素的数组 nums
,**原地**对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
我们使用整数 0
、 1
和 2
分别表示红色、白色和蓝色。
必须在不使用库内置的 sort 函数的情况下解决这个问题。
示例 1:
1 2
| 输入:nums = [2,0,2,1,1,0] 输出:[0,0,1,1,2,2]
|
示例 2:
1 2
| 输入:nums = [2,0,1] 输出:[0,1,2]
|
提示:
n == nums.length
1 <= n <= 300
nums[i]
为 0
、1
或 2
进阶:
解题思路
方法一
见代码
方法二

方法三

代码实现
方法一
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| public class Solution75Case1 { private static final int RED = 0; private static final int WHITE = 1; private static final int BULE = 2;
public static void sortColors(int[] nums) { List<Integer> redList = new ArrayList<>(); List<Integer> whiteList = new ArrayList<>(); List<Integer> buleList = new ArrayList<>(); for (int num : nums) { if (RED == num) { redList.add(num); } else if (WHITE == num) { whiteList.add(num); } else if (BULE == num) { buleList.add(num); } } for (int i = 0; i < redList.size(); i++) { nums[i] = redList.get(i); } for (int i = 0; i < whiteList.size(); i++) { nums[redList.size() + i] = whiteList.get(i); } for (int i = 0; i < buleList.size(); i++) { nums[redList.size() + whiteList.size() + i] = buleList.get(i); } } }
|
方法二
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| public class Solution75Case2 { public static void sortColors(int[] nums) { int n = nums.length; int ptr = 0; for (int i = 0; i < n; i++) { if (nums[i] == 0) { int temp = nums[i]; nums[i] = nums[ptr]; nums[ptr] = temp; ptr++; } } for (int i = ptr; i < n; i++) { if (nums[i] == 1) { int temp = nums[i]; nums[i] = nums[ptr]; nums[ptr] = temp; ptr++; } } } }
|
方法三
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| public class Solution75Case3 { public void sortColors(int[] nums) { int n = nums.length; int p0 = 0, p2 = n - 1; for (int i = 0; i <= p2; ++i) { while (i <= p2 && nums[i] == 2) { int temp = nums[i]; nums[i] = nums[p2]; nums[p2] = temp; --p2; } if (nums[i] == 0) { int temp = nums[i]; nums[i] = nums[p0]; nums[p0] = temp; ++p0; } } } }
|