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:
- Counting Sort
- 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