In-place Manipulation

Loading concept...

🎨 Array Mastery: The Art of In-Place Magic

Imagine you have a messy room with toys everywhere. Instead of getting a new room, you learn to organize everything RIGHT WHERE IT IS. That’s in-place manipulation!


🌈 The Dutch National Flag Algorithm

What’s the Story?

Picture this: You have a bag of marbles - red, white, and blue ones, all mixed up. Your mission? Sort them so all reds are first, then whites, then blues. But here’s the twist - you can only swap marbles inside the same bag!

This is exactly what the Dutch National Flag Algorithm does with arrays containing three distinct values.

The Three-Pointer Dance 💃

We use three pointers like three helpers:

  • Low - marks where reds should go
  • Mid - the explorer checking each element
  • High - marks where blues should go
// Colors: 0=Red, 1=White, 2=Blue
void dutchFlag(int[] arr) {
    int low = 0;
    int mid = 0;
    int high = arr.length - 1;

    while (mid <= high) {
        if (arr[mid] == 0) {        // Red!
            swap(arr, low, mid);
            low++;
            mid++;
        } else if (arr[mid] == 1) { // White!
            mid++;
        } else {                     // Blue!
            swap(arr, mid, high);
            high--;
        }
    }
}

See It Work!

Start:  [2, 0, 1, 2, 0, 1, 0]
         ↑              ↑
        L,M             H

Step 1: arr[mid]=2 → swap with high
        [0, 0, 1, 2, 0, 1, 2]
         ↑           ↑
        L,M          H

Step 2: arr[mid]=0 → swap with low
        [0, 0, 1, 2, 0, 1, 2]
            ↑        ↑
           L,M       H

...continue until sorted!
Final:  [0, 0, 0, 1, 1, 2, 2]

Why Is It Magic? ✨

  • One pass only! - We touch each element just once
  • No extra space! - Everything happens in the original array
  • O(n) time, O(1) space - Super efficient!

🗳️ Boyer-Moore Voting Algorithm

The Election Story

Imagine a town election where people shout out their favorite candidate. You have a magical counter that:

  1. If the counter shows your candidate → ADD a vote
  2. If the counter shows someone else → REMOVE a vote
  3. If votes hit zero → The next person becomes the new candidate

If someone has more than half the votes (majority), they’ll survive this battle!

The Simple Code

int findMajority(int[] nums) {
    int candidate = nums[0];
    int count = 1;

    // Phase 1: Find potential candidate
    for (int i = 1; i < nums.length; i++) {
        if (count == 0) {
            candidate = nums[i];
            count = 1;
        } else if (nums[i] == candidate) {
            count++;
        } else {
            count--;
        }
    }

    // Phase 2: Verify (optional)
    return candidate;
}

Watch the Battle! ⚔️

Array: [2, 2, 1, 1, 1, 2, 2]

Step 1: candidate=2, count=1
Step 2: 2=candidate → count=2
Step 3: 1≠candidate → count=1
Step 4: 1≠candidate → count=0
Step 5: count=0 → candidate=1, count=1
Step 6: 2≠candidate → count=0
Step 7: count=0 → candidate=2, count=1

Winner: 2

The Secret Sauce 🍯

  • If a true majority exists (>50%), it will always win
  • Pairs of different elements “cancel out”
  • The majority survives because it has more soldiers!

🧹 Remove Duplicates from Sorted Array

The Moving Day Story

You’re moving to a new apartment and packing books. But wait - you have duplicate copies! Your bookshelf can only fit unique books, and you must pack them at the front of your box without using another box.

The Two-Pointer Trick

int removeDuplicates(int[] nums) {
    if (nums.length == 0) return 0;

    int writePos = 1;  // Where to write next unique

    for (int i = 1; i < nums.length; i++) {
        if (nums[i] != nums[i - 1]) {
            nums[writePos] = nums[i];
            writePos++;
        }
    }

    return writePos;  // New length
}

Visual Journey 📚

Original: [1, 1, 2, 2, 2, 3, 4, 4]
           ↑
        writePos

Check: Is 1 ≠ 1? No, skip!
Check: Is 2 ≠ 1? Yes! Write 2
       [1, 2, 2, 2, 2, 3, 4, 4]
              ↑
           writePos

Check: Is 2 ≠ 2? No, skip!
Check: Is 2 ≠ 2? No, skip!
Check: Is 3 ≠ 2? Yes! Write 3
       [1, 2, 3, 2, 2, 3, 4, 4]
                 ↑
              writePos

Final:  [1, 2, 3, 4, _, _, _, _]
        └─────────┘
         New length = 4

Key Insight 💡

  • Sorted array = duplicates are neighbors
  • We only copy when we find something new
  • Old duplicates get overwritten (we don’t care!)

🎯 Move Zeroes

The Dance Floor Story

Imagine a dance floor where dancers (non-zero numbers) and sleepers (zeroes) are mixed. You need to push all sleepers to the back so dancers can party at the front - but everyone must stay on the same floor!

Two Approaches

Approach 1: The Swap Dance

void moveZeroes(int[] nums) {
    int insertPos = 0;  // Next dancer position

    for (int i = 0; i < nums.length; i++) {
        if (nums[i] != 0) {
            // Swap dancer to front
            int temp = nums[insertPos];
            nums[insertPos] = nums[i];
            nums[i] = temp;
            insertPos++;
        }
    }
}

Approach 2: Shift and Fill

void moveZeroes(int[] nums) {
    int insertPos = 0;

    // Move all non-zeros forward
    for (int num : nums) {
        if (num != 0) {
            nums[insertPos++] = num;
        }
    }

    // Fill rest with zeros
    while (insertPos < nums.length) {
        nums[insertPos++] = 0;
    }
}

Watch the Magic! 🎪

Start:   [0, 1, 0, 3, 12]
          ↑
       insertPos

i=0: 0 is zero, skip!
i=1: 1 is dancer! Swap with position 0
         [1, 0, 0, 3, 12]
             ↑
          insertPos

i=2: 0 is zero, skip!
i=3: 3 is dancer! Swap with position 1
         [1, 3, 0, 0, 12]
                ↑
             insertPos

i=4: 12 is dancer! Swap with position 2
         [1, 3, 12, 0, 0]
                    ↑
                 insertPos

Done! 🎉

🎓 The Big Picture

graph LR A[In-Place Array Manipulation] --> B[Dutch National Flag] A --> C[Boyer-Moore Voting] A --> D[Remove Duplicates] A --> E[Move Zeroes] B --> B1[Sort 3 distinct values] B --> B2[O#40;n#41; time, O#40;1#41; space] C --> C1[Find majority element] C --> C2[Pairing/Cancellation trick] D --> D1[Remove duplicates in sorted] D --> D2[Two-pointer technique] E --> E1[Push non-zeros to front] E --> E2[Maintain relative order]

🏆 Summary: Your Toolkit

Algorithm Use When Key Trick
Dutch Flag Sort 3 values 3 pointers (low, mid, high)
Boyer-Moore Find majority Vote counting magic
Remove Dups Clean sorted array Write pointer
Move Zeroes Push zeros back Swap non-zeros forward

💪 You’ve Got This!

Remember: In-place means you’re a ninja - working within constraints, no extra space, maximum efficiency. These four algorithms are your secret weapons for array mastery!

Each technique teaches you the power of pointers - invisible hands that dance through your array, transforming chaos into order without breaking a sweat.

“The best code doesn’t need extra space. It makes magic happen right where the data lives.”

🚀 Now go practice and make these algorithms second nature!

Loading story...

No Story Available

This concept doesn't have a story yet.

Story Preview

Story - Premium Content

Please sign in to view this concept and start learning.

Upgrade to Premium to unlock full access to all content.

Interactive Preview

Interactive - Premium Content

Please sign in to view this concept and start learning.

Upgrade to Premium to unlock full access to all content.

No Interactive Content

This concept doesn't have interactive content yet.

Cheatsheet Preview

Cheatsheet - Premium Content

Please sign in to view this concept and start learning.

Upgrade to Premium to unlock full access to all content.

No Cheatsheet Available

This concept doesn't have a cheatsheet yet.

Quiz Preview

Quiz - Premium Content

Please sign in to view this concept and start learning.

Upgrade to Premium to unlock full access to all content.

No Quiz Available

This concept doesn't have a quiz yet.