题目: 颜色分类
来自智得网
分析
方法一:计数排序
计数排序是一种非比较排序算法,其核心思想是统计每个元素在序列中出现的次数,进而推导出每个元素在有序序列中的位置。
具体来说,对于该问题,我们可以先统计 0、1、2 三个元素在数组中出现的次数,然后再按照 0、1、2 的顺序依次将这些元素填入数组中即可。
Java 代码如下:
class Solution {
public void sortColors(int[] nums) {
int[] count = new int[3];
for (int i = 0; i < nums.length; i++) {
count[nums[i]]++;
}
int k = 0;
for (int i = 0; i < count.length; i++) {
for (int j = 0; j < count[i]; j++) {
nums[k++] = i;
}
}
}
}
方法二:双指针
双指针算法是一种非常高效的解决问题的算法,其核心思想是使用两个指针来遍历数组,并且在遍历的过程中改变指针的位置,进而达到解决问题的目的。
具体来说,对于该问题,我们可以使用双指针算法,将数组划分成三个区间:0 的区间、1 的区间和 2 的区间。在遍历的过程中,使用指针 p0 和 p2 分别指向数组的起始位置和末尾位置,然后使用指针 i 遍历数组。在遍历的过程中,如果遇到了 0,就将它和 p0 指向的元素进行交换;如果遇到了 2,就将它和 p2 指向的元素进行交换。这样,遍历一遍之后,数组就被划分成了三个区间。
Java 代码如下:
class Solution {
public void sortColors(int[] nums) {
int p0 = 0, p2 = nums.length - 1;
for (int i = 0; i <= p2; i++) {
while (i <= p2 && nums[i] == 2) {
swap(nums, i, p2);
p2--;
}
if (nums[i] == 0) {
swap(nums, i, p0);
p0++;
}
}
}
private void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}