two pointers
three pointers
]
Leetcode 0075. Sort Colors
https://leetcode.com/problems/sort-colors
This problem is called Dutch national flag problem: https://en.wikipedia.org/wiki/Dutch_national_flag_problem
The idea here is the following: we keep 3 pointers: for each of colors (numbers). I called them
beg = 0, mid = 0, end = len(nums) - 1. The idea here is to put sorted 0 and 1 to the beginning and sorted 2s to the end. Then we iterate over all elements and process each new element in the following way. Imagine, that we already sorted some of the elements, our invariant will be 00...0011...11......22....22, where we already put some 0 and 1 in the beggining and some 2 to the end. Then there are 3 possible optinos for new element ?:
00...0011...11?......22....22, where? = 1, then we do not need to change any elements, just movemidpointer by1to the right.00...0011...11?......22....22, where? = 2, then we need to put this element befor the first already sorted2, so we change these elements and then move pointerendby1to the left.00...0011...11?......22....22, where? = 0, then we need to swap this element with the last sorted0and also move two pointersmidandbegby 1.
We can see it this way, that pointers beg, mid and end always point at elements just after the last 0, after the last 1 and before the first 2.
Complexity: Time complexity is O(n), because each moment of time we move at least one of the pointers. Additional space complexity is O(1): to keep only 3 variables: beg, mid and end.
class Solution:
def sortColors(self, nums):
beg, mid, end = 0, 0, len(nums) - 1
while mid <= end:
if nums[mid] == 0:
nums[beg], nums[mid] = nums[mid], nums[beg]
mid += 1
beg += 1
elif nums[mid] == 2:
nums[mid], nums[end] = nums[end], nums[mid]
end -= 1
else: #nums[mid] == 1:
mid += 1
If you like the solution, you can upvote it on leetcode discussion section: Problem 0075