75. Sort Colors

Difficulty:
Related Topics:
Similar Questions:

Problem

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:

Solution 1

/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var sortColors = function(nums) {
  var counts = [0, 0, 0];
  var len = nums.length;
  for (var i = 0; i < len; i++) {
    counts[nums[i]]++;
  }
  for (var j = 0; j < len; j++) {
    nums[j] = j < counts[0] ? 0 : (j < counts[0] + counts[1] ? 1 : 2);
  }
};

Explain:

nope.

Complexity:

Solution 2

/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var sortColors = function(nums) {
  var m = 0;
  var n = 0;
  var k = nums.length;
  for (var i = 0; i < k; i++) {
    if (nums[i] === 0) {
      nums[i] = 2;
      nums[n++] = 1;
      nums[m++] = 0;
    } else if (nums[i] === 1) {
      nums[i] = 2;
      nums[n++] = 1;
    } else {
      nums[i] = 2;
    }
  }
};

Explain:

[0, m)0[m, n)1[n, k)2

Complexity:

Solution 3

/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var sortColors = function(nums) {
  var j = 0;
  var k = nums.length - 1;
  for (var i = 0; i <= k; i++) {
    if (nums[i] === 0) {
      swap(nums, i, j++);
    } else if (nums[i] === 2) {
      swap(nums, i--, k--);
    }
  }
};

var swap = function (arr, a, b) {
  var tmp = arr[a];
  arr[a] = arr[b];
  arr[b] = tmp;
};

Explain:

[0, j)0[j, k)1[k, len)2

Complexity: