leetcode
75. 颜色分类

问题描述

LeetCode 75. 颜色分类 (opens in a new tab),难度中等

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

我们使用整数 012 分别表示红色、白色和蓝色。

必须在不使用库内置的 sort 函数的情况下解决这个问题。

示例 1

输入:nums = [2,0,2,1,1,0]
输出:[0,0,1,1,2,2]

示例 2

输入:nums = [2,0,1]
输出:[0,1,2]

提示:

  • n == nums.length
  • 1 <= n <= 300
  • nums[i]012

进阶:

  • 你能想出一个仅使用常数空间的一趟扫描算法吗?

题解

双指针

解题思路:定义 left 用于交换 0,定义 right 用于交换 2

  • curr0 的时候,和 left 交换,自增 1
  • curr2 的时候,和 right 交换,自增 1
  • curr1 的时候自增 1
Solution.java
class Solution {
    public void swap(int[] nums, int i, int j) {
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
 
    public void sortColors(int[] nums) {
        int left = 0, curr = 0, right = nums.length - 1;
        while (curr <= right) {
            if (nums[curr] == 0) {
                swap(nums, left, curr);
                left++;
                curr++;
            } else if (nums[curr] == 2) {
                swap(nums, right, curr);
                right--;
            } else {
                curr++;
            }
        }
    }
}