FAANGPrep Sprint
Sort Colors
Sort an array of 0s, 1s and 2s (red, white and blue) in place and in one pass, so equal colours sit together in the order red, white, blue.
Problem Understanding
The Goal
We need to sort an array containing only 0s, 1s, and 2s. The catch is that we must do this in-place (without creating a new array) and ideally in one pass (O(n) time).
- 0: Represents Red (should be at the beginning)
- 1: Represents White (should be in the middle)
- 2: Represents Blue (should be at the end)
Input/Output Examples
Input:
nums = [2, 0, 2, 1, 1, 0]Output:
[0, 0, 1, 1, 2, 2]Input:
nums = [2, 0, 1]Output:
[0, 1, 2]
Constraints
n == nums.length1 <= n <= 300nums[i]is either0,1, or2.
Note: A simple solution would be to count the number of 0s, 1s, and 2s, and then overwrite the array. However, the "Dutch National Flag" algorithm allows us to do this in a single pass with constant space.
Algorithm Strategy
The Dutch National Flag Algorithm
This problem is a classic variation of the Dutch National Flag problem proposed by Edsger Dijkstra. We use three pointers to partition the array into three sections:
low: The boundary for 0s (Red). Everything beforelowis0.high: The boundary for 2s (Blue). Everything afterhighis2.mid: The current element iterator. Everything betweenlowandmidis1(White).
The Logic
We iterate with the mid pointer and check nums[mid]:
- If
nums[mid] == 0:- This belongs in the "0 zone" (at the start).
- Swap
nums[mid]withnums[low]. - Increment both
lowandmid.
- If
nums[mid] == 1:- This belongs in the middle. It's already in the right relative place.
- Just increment
mid.
- If
nums[mid] == 2:- This belongs in the "2 zone" (at the end).
- Swap
nums[mid]withnums[high]. - Decrement
high. - Crucial: Do NOT increment
midyet! The element we just swapped fromhightomidhasn't been checked. We need to process it in the next iteration.
Visualizing the Zones
[0, 0, ... 0 1, 1, ... 1 ?, ?, ... ? 2, 2, ... 2]
^ ^ ^ ^
0 low mid high
Visualization
0 RED · 1 WHITE · 2 BLUE
THREE POINTERS
low mid
0
1
2
3
4
high
5
low
0
mid
0
high
5
low and mid start at 0, high at 5. Before low: all 0s. After high: all 2s
Next
mid ≤ high, so look at nums[0] = 2
Colors
Watch low, mid and high partition the array: everything before low is 0, everything after high is 2, and mid decides where the next value goes.
