Knowledge Guide
HomeDSACompany Practice

hard Minimum Replacements to Sort the Array

Problem Statement

Given a 0-indexed integer array nums, return the minimum number of operations to make an array that is sorted in a non-decreasing order.

In a single operation, you can pick any element of the array and replace it with any two elements that sum to it.

Examples

Try it yourself

Try solving this question here:

✅ Solution Minimum Replacements to Sort the Array

Problem Statement

Given a 0-indexed integer array nums, return the minimum number of operations to make an array that is sorted in a non-decreasing order.

In a single operation, you can pick any element of the array and replace it with any two elements that sum to it.

  • For example, consider nums = [4,3,5]. In one operation, you can replace nums[0] with 1 and 3 and convert nums to [1,3,3,5].

Examples

  • Example 1:

    • Input: nums = [4, 3, 2]
    • Expected Output: 4
    • Justification: Replace 4 with two 2s (1 operation), resulting in [2, 2, 3, 2]. Then, to maintain non-decreasing order, replace the first two elements with 1 and 1 (2 operations), and the 3 with 1 and 2 (1 operation), totaling 4 operations.
  • Example 2:

    • Input: nums = [3, 4, 5, 6, 7]
    • Expected Output: 0
    • Justification: The array is already in non-decreasing order, so no operations are needed.
  • Example 3:

    • Input: nums = [6, 3, 9, 7, 4]
    • Expected Output: 4
    • Justification:
      • Replace 6 with 3 and 3 (1 operation).
      • Replace 9 with 3 and 6, and then replace 6 with 3 and 3 (2 operations).
      • Replace 7 with 3 and 4 (1 operation).
      • Total 4 operations.

Solution

To solve this problem, we begin by working backwards from the end of the array towards the start, aiming to minimize the number of operations. This approach is effective because sorting the array in a non-decreasing order allows us to identify the maximum possible value that can be placed without further replacements, thereby reducing the total number of operations. By ensuring that each replacement contributes directly towards the final sorted form of the array, we minimize redundant operations.

The key to this strategy is to leverage the sorted property of the target array state. By making replacements that anticipate the final positions of the new elements, we can directly influence the array's progression towards being sorted. This method is highly efficient because it focuses on reducing the largest elements first, which are the most impactful in terms of the number of required operations.

Step-by-Step Algorithm

  1. Initialize Variables:

    • Set operations to 0, which will count the total number of replacement operations performed.
    • Identify currentMax as the last element in the array, assuming the array ends in a sorted state.
  2. Iterate Backwards Through the Array:

    • Starting from the second-to-last element, move backwards through the array.
  3. Check and Compare:

    • For each element, compare it with currentMax.
    • If the current element is greater than currentMax, it implies that the element is out of order and needs to be split into smaller numbers to maintain the non-decreasing order.
  4. Calculate Splits:

    • If splitting is required, calculate the minimum number of splits (or replacements) by dividing the current element by currentMax and rounding up, minus one. This gives the minimum splits needed to reduce the current element without exceeding the currentMax.
  5. Update Operations:

    • Add the number of splits to operations.
  6. Update currentMax:

    • If splits were performed, update currentMax to the value obtained by dividing the current element by the number of splits plus one. This ensures that currentMax reflects the highest value that can be placed in the current position without violating the sorting rule.
  7. Repeat Until Start:

    • Continue this process for each element until the start of the array is reached.
  8. Return Operations:

    • After processing all elements, return operations as the minimum number of replacements needed.

Algorithm Walkthrough

Let's consider the input: nums = [6, 3, 9, 7, 4].

  • Start:

    • operations = 0
    • currentMax = 4 (last element)
  • Element 7:

    • currentMax = 4, Element = 7
    • Splits required for 7 to not exceed 4: ceil(7/4) - 1 = 1
    • operations = 1
    • Update currentMax to 7 / (1 + 1) = 3.5 (but since we deal with integers, it effectively becomes 3 when comparing)
  • Element 9:

    • currentMax = 3, Element = 9
    • Splits required for 9 to not exceed 3: ceil(9/3) - 1 = 2
    • operations = 1 (previous) + 2 = 3
    • Update currentMax to 9 / (2 + 1) = 3
  • Element 3:

    • currentMax = 3, Element = 3
    • No operation needed as 3 equals currentMax.
  • Element 6:

    • currentMax = 3, Element = 6
    • Splits required for 6 to not exceed 3: ceil(6/3) - 1 = 1
    • operations = 3 (previous) + 1 = 4
    • Update currentMax to 6 / (1 + 1) = 3
  • End:

    • All elements have been processed.
    • Total operations = 4

Code

java
class Solution {

  // Method to calculate the minimum replacements to sort the array
  public long minimumReplacement(int[] nums) {
    long operations = 0; // Store the total operations required
    int n = nums.length;
    int currentMax = nums[n - 1]; // Start from the last element, assuming it's the current maximum

    // Iterate through the array from the second last element to the first
    for (int i = n - 2; i >= 0; i--) {
      if (nums[i] > currentMax) {
        // If the current element is greater than the current maximum,
        // calculate the number of splits needed to make it fit into a sorted array
        int splits = (int) Math.ceil((double) nums[i] / currentMax) - 1;
        operations += splits; // Add the splits to the total operations
        currentMax = nums[i] / (splits + 1); // Update the current maximum value
      } else {
        // If the current element is not greater, update the current maximum to this element
        currentMax = nums[i];
      }
    }
    return operations;
  }

  public static void main(String[] args) {
    Solution solution = new Solution();
    // Example 1
    System.out.println(solution.minimumReplacement(new int[] { 4, 3, 2 })); // Expected: 4
    // Example 2
    System.out.println(
      solution.minimumReplacement(new int[] { 3, 4, 5, 6, 7 })
    ); // Expected: 0
    // Example 3
    System.out.println(
      solution.minimumReplacement(new int[] { 6, 3, 9, 7, 4 })
    ); // Expected: 4
  }
}

Complexity Analysis

Time Complexity

  • : The algorithm iterates through the input array once from the end to the beginning. During each iteration, it performs constant time operations such as comparison, arithmetic operations, and assignment. Therefore, the time complexity is linear in the size of the input array, where (n) is the number of elements in the array.

Space Complexity

  • : The algorithm uses a fixed amount of extra space regardless of the input size.
🤖 Don't fully get this? Learn it with Claude

Stuck on Minimum Replacements to Sort the Array? Open Claude, copy a block below, and it'll teach you this exact concept — visually and interactively.

🪜 Hint ladder (no spoilers)

Progressively stronger hints — you still solve it.

I'm working on the problem **Minimum Replacements to Sort the Array** (DSA). Give me a HINT LADDER: start with the tiniest nudge, then wait. Only reveal the next, stronger hint when I ask. Do NOT show the full solution unless I type 'show solution'. Keep me doing the thinking. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.
🎨 Explain the approach visually

See the technique, not just code.

Explain the optimal approach to **Minimum Replacements to Sort the Array** with a VISUAL walkthrough: trace it on a small concrete example using ASCII art / a step-by-step diagram, narrate what changes each step, then give time & space complexity with a one-line derivation. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.
🔍 Review my solution

Catch bugs, edge cases, sub-optimality.

I'll paste my solution to **Minimum Replacements to Sort the Array**. Review it for correctness, missed edge cases, and time/space complexity, then coach me toward the optimal — don't just rewrite it. Ask me to paste my code now. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.
🔁 Drill the pattern

Lock in recognition with look-alikes.

Give me 2 problems that use the SAME underlying pattern as **Minimum Replacements to Sort the Array**. For each, let me attempt first, then review my answer and name the trigger signal that reveals the pattern. If you're unsure or a claim isn't standard, say so and reason from first principles instead of guessing.

📝 My notes