题目描述
给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
必须在不使用库内置的 sort 函数的情况下解决这个问题。
思路
可以使用单个指针扫描两遍或者三指针扫描一遍的方法
思路1 单指针扫描两遍
指针i初始指向数组的第一个元素,指针j初始也指向数组的第一个元素,第一遍用j遍历整个数组,当j指到的数为0时,将其与指针i所指元素交换,同时i加1;第二遍用j从i位置开始遍历,当j指向的数为1时,将其与指针i所指元素交换,同时i加1
思路2 三指针扫描一次
指针p0初始指向数组第一个元素,指针p2指向数组最后一个元素,指针i初始指向数组第一个元素,指针i从前往后遍历直到与p2相遇为止,当i指向元素为0时就和p0所指元素交换,当i指向元素为2时就与p2所指元素交换并且i本次不往后移动,因为从p2交换过来的数还没有进行判断
代码
思路1代码
//单指针扫两遍,第一遍把所有的0交换到数组最左边,第二编把所有的1交换到剩下数组范围的最左边
public void sortColors(int[] nums) {
int i = 0, j = 0;
for (; j < nums.length; j++) {
if (nums[j] == 0) {
nums[j] = nums[i];
nums[i] = 0;
i++;
}
}
j = i;
for (; j < nums.length; j++) {
if (nums[j] == 1) {
nums[j] = nums[i];
nums[i] = 1;
i++;
}
}
}
思路2代码
public void sortColors(int[] nums) {
int p0 = 0, p2 = nums.length - 1;
int i = 0;
while (i <= p2) {
if (nums[i] == 0) {
nums[i] = nums[p0];
nums[p0] = 0;
p0++;
i++;
} else if (nums[i] == 2) {
nums[i] = nums[p2];
nums[p2] = 2;
p2--;
} else {
i++;
}
}
}
标签:p2,分类,指向,nums,元素,75,数组,LeetCode,指针
From: https://www.cnblogs.com/zawaludo/p/18341843