Arrange Magical Orbs - codepath/compsci_guides GitHub Wiki
TIP102 Unit 3 Session 2 Advanced (Click for link to problem statements)
U-nderstand
Understand what the interviewer is asking for by using test cases and questions about the problem.
- Q: What is the input to the problem?
- A: The input is a list
orbs
where each element is an integer representing the color of a magical orb (0 for red, 1 for white, and 2 for blue).
- A: The input is a list
- Q: What is the output?
- A: The output is the same list
orbs
, but with the orbs arranged so that all orbs of the same color are adjacent and ordered as red (0), white (1), and blue (2).
- A: The output is the same list
- Q: Are there any constraints on how the arrangement should be performed?
- A: Yes, the arrangement must be done in-place without using any built-in sorting functions.
P-lan
Plan the solution with appropriate visualizations and pseudocode.
General Idea: Use the Dutch National Flag algorithm, which efficiently sorts the list in a single pass by maintaining three pointers for the low (red), mid (white), and high (blue) regions.
1. Initialize three pointers: `low` at the start of the list, `mid` at the start of the list, and `high` at the end of the list.
2. Iterate through the list with the `mid` pointer:
1. If `orbs[mid]` is `0` (red):
- Swap `orbs[mid]` with `orbs[low]`.
- Increment both `low` and `mid`.
2. If `orbs[mid]` is `1` (white):
- Increment `mid`.
3. If `orbs[mid]` is `2` (blue):
- Swap `orbs[mid]` with `orbs[high]`.
- Decrement `high`.
3. Continue this process until `mid` is greater than `high`.
4. The list `orbs` will now be arranged in the order red, white, and blue.
⚠️ Common Mistakes
- Failing to correctly update the pointers, leading to infinite loops or incorrect ordering.
- Forgetting that the algorithm must be performed in-place.
I-mplement
def arrange_magical_orbs(orbs):
low, mid, high = 0, 0, len(orbs) - 1
while mid <= high:
if orbs[mid] == 0: # Red orb
orbs[low], orbs[mid] = orbs[mid], orbs[low]
low += 1
mid += 1
elif orbs[mid] == 1: # White orb
mid += 1
else: # Blue orb
orbs[mid], orbs[high] = orbs[high], orbs[mid]
high -= 1
# Example usage
orbs1 = [2, 0, 2, 1, 1, 0]
arrange_magical_orbs(orbs1)
print(orbs1) # Output: [0, 0, 1, 1, 2, 2]
orbs2 = [2, 0, 1]
arrange_magical_orbs(orbs2)
print(orbs2) # Output: [0, 1, 2]