75. Sort Colors

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?

Thoughts:

  1. Counting Sort
  2. Just like the Lomuto partition algorithm usually used in quick sort. We keep a loop invariant that [0,i) [i, j) [j, k) are 0s, 1s and 2s sorted in place for [0,k). Here ")" means exclusive. We don't need to swap because we know the values we want. (dietpepsi's post)

Code: Counting Sort:

class Solution(object):
    def sortColors(self, nums):
        """
        :type nums: List[int]
        :rtype: void Do not return anything, modify nums in-place instead.
        """
        d = collections.defaultdict(int)
        for num in nums: d[num]+=1

        i = 0
        for num in xrange(0,3):
            for t in xrange(d[num]):
                nums[i] = num
                i+= 1

Code: Partition: one pass

class Solution(object):
    def sortColors(self, nums):
        """
        :type nums: List[int]
        :rtype: void Do not return anything, modify nums in-place instead.
        """
        i = j = 0
        for k, v in enumerate(nums):
            nums[k] = 2
            if v < 2:
                nums[j] = 1;
                j+= 1
            if v == 0:
                nums[i] = 0
                i+= 1

results matching ""

    No results matching ""