这是我参与2022首次更文挑战的第13天,活动详情查看:2022首次更文挑战
leetcode 颜色分类
给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
必须在不使用库的sort函数的情况下解决这个问题。
示例 1:
输入:nums = [2,0,2,1,1,0]
输出:[0,0,1,1,2,2]
示例 2:
输入:nums = [2,0,1]
输出:[0,1,2]
解题: 根据题目的意思0,、1、2分别表示红色、白色和蓝色,然后要求自己实现红色、白色、蓝色的数组顺序排列。简单的办法可以先一次遍历,然后分别记录下各个颜色对应出现的次数就是数量,然后再遍历一次数组,直接按红色、白色、蓝色的数量顺序赋值上对应的值,最后数组就是按颜色排好序的了。
或者使用指针:
使用一个指针来遍历数组,两两交换的操作,首先遍历一次数组,将数组中的所有0的元素交换到数组前面部分,然后再遍历一次将数组的所以1元素交换到0元素的后面,最后所有的2元素都是在数组最后部分,所以整个数组都是按颜色排列有序的了。具体的定义一个pointer指针表示一个颜色的边界,初始指向数组开始位置0,然后开始遍历数组,当遇到0元素时,就将这个元素与指针指向的元素进行交换,然后指针需要后移一位,循环往复保证pointer前的元素都是0,最后遍历结束时指针所指位置前的元素都是0了,然后再从pointer指针位置遍历其余元素,当遇到元素0时,就将当前遍历的元素与指针位置元素交换,同样pointer指针也要后移一位,最后遍历结束时pointer前都是0、1的元素,后边部分如果还有元素那都是2了,最后整个数组都是按0、1、2的顺序排列了。
class Solution {
public void sortColors(int[] nums) {
int len = nums.length;
int pointer = 0;
for (int i = 0; i < len; i++) {
if (nums[i] == 0) {
swap(nums, i, pointer);
pointer++;
}
}
for (int i = pointer; i < len; i++) {
if (nums[i] == 1) {
swap(nums, i, pointer);
pointer++;
}
}
}
private void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}