跳转至

75. Sort Colors

Leetcode Two Pointers Array Sort

Given an array with n objects colored red, white or blue, sort them in-place so that objects of the same color are adjacent, with the colors in the order red, white and blue.

Here, we will use the integers 0, 1, and 2 to represent the color red, white, and blue respectively.

Note: You are not suppose to use the library's sort function for this problem.

Example:

Input: [2,0,2,1,1,0]
Output: [0,0,1,1,2,2]

Follow up:

  • A rather straight forward solution is a two-pass algorithm using counting sort.
  • First, iterate the array counting number of 0's, 1's, and 2's, then overwrite array with total number of 0's, then 1's and followed by 2's.
  • Could you come up with a one-pass algorithm using only constant space?

分析

题目都说了可以使用计数排序(couting sort),那么肯定先用计数排序:先计数每一种颜色的数目,然后按顺序将数组填充上相应数目的颜色。

public void sortColors(int[] nums) {
    int[] colorCount = new int[3]; // count 0, 1, 2
    for (int color : nums)
        colorCount[color]++;
    for (int i = 0, index = 0; i < 3; i++)
        for ( ; colorCount[i] > 0; colorCount[i]--)
            nums[index++] = i;
}

这道题目实际上是Dutch national flag problem,是鼎鼎大名的Dijkstra提出的。方法是使用3-Way Partition。平均时间复杂度是O(n),空间复杂度是O(1).

// 3-way partition
public void sortColors(int[] nums) {
    int lt = 0, i = 0, gt = nums.length - 1;
    int v = 1;
    while (i <= gt) {
        if (nums[i] < v) swap(nums, lt++, i++);
        else if (nums[i] > v) swap(nums, i, gt--);
        else i++;
    }
}
private void swap(int[] nums, int i, int j) {
    int tmp = nums[i];
    nums[i] = nums[j];
    nums[j] = tmp;
}