【Leetcode】75. 颜色分类

46 阅读2分钟

题目描述

在这里插入图片描述

// 75. 颜色分类

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

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

题解

// 我写了个快排,然后stackoverflow,通不过,看来分治递归的方法不能直接用。
//
// 双指针法
// 构建p0指针专门看0,从头开始遍历,构建p2指针专门看2,从尾开始遍历,
// 构建交换位置函数swap。
// for循环遍历nums元素,遍历元素为nums[i],索引i遇到p2停止,
// 构建第二层while循环,当i小于等于p2指针时,如果nums[i]当前遍历元素为2,
// 说明nums[i]需要放到数组尾部,将nums[i]和nums[p2]交换,之后p2左移一位。
// 用while循环而不用if是防止当前nums[p2]也为2,此时nums[i]和nums[p2]交换,
// 换了个寂寞。所以while循环可以让p2左移直到nums[i]的2真的被换走,
// 从nums[p2]换来的新nums[i]已经不再是2了,while就终止了。
// 之后条件判断,如果nums[i]为0,交换nums[i]和nums[p0],p0是从头开始往右,
// 所以所有nums[i]发现的0都会被p0指针换到数组头部。直到i与p2指针相遇,
// for循环终止,则排序结束。
// 
// 执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
// 内存消耗:37.1 MB, 在所有 Java 提交中击败了30.44%的用户
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++;
			}
		}
    }
	
	public void swap(int[] nums, int i, int j) {
		int temp = nums[i];
		nums[i] = nums[j];
		nums[j] = temp;
	}
}