Dutch National Flag (Sort Colors)

Given an array with values 0, 1, and 2, sort them in-place so all 0s come first, then 1s, then 2s. (LeetCode 75: Sort Colors)

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

Solution Approach

Three-pointer approach (Dutch National Flag algorithm by Dijkstra): maintain pointers lo, mid, hi. Invariant: arr[0..lo-1]=0, arr[lo..mid-1]=1, arr[hi+1..n-1]=2.

  • Initialize lo=0, mid=0, hi=n-1.
  • While mid <= hi: if arr[mid]==0 swap arr[lo] and arr[mid], lo++, mid++.
  • If arr[mid]==1, just mid++.
  • If arr[mid]==2, swap arr[mid] and arr[hi], hi-- (do not advance mid).
Java
class Solution {
    public void sortColors(int[] nums) {
        int lo = 0, mid = 0, hi = nums.length - 1;
        while (mid <= hi) {
            if (nums[mid] == 0) {
                int tmp = nums[lo]; nums[lo] = nums[mid]; nums[mid] = tmp;
                lo++; mid++;
            } else if (nums[mid] == 1) {
                mid++;
            } else {
                int tmp = nums[mid]; nums[mid] = nums[hi]; nums[hi] = tmp;
                hi--;
            }
        }
    }
}
  • Time Complexity: O(N). Single pass
  • Space Complexity: O(1) in-place