⚖️ Beginner-Friendly Guide 'Minimum Removals to Balance Array' - Problem 3634 (C++, Python, JavaScript)

Published: (February 5, 2026 at 08:43 PM EST)
3 min read
Source: Dev.to

Source: Dev.to

Problem Summary

You’re given:

  • An array of integers called nums.
  • An integer k representing the maximum allowed ratio between the largest and smallest elements.

Your goal is to calculate the minimum number of elements you need to remove to make the array balanced. An array is balanced if

[ \frac{\text{max}}{\text{min}} \le k ]

Intuition: The Power of Sorting

To satisfy a condition involving the minimum and maximum elements, the first step is to sort the array. In a sorted array, any contiguous subarray (a slice) has its first element as the minimum and its last element as the maximum.

The solution uses a greedy “two‑pointer” or “sliding window” approach.
Fix an element as the minimum and include as many subsequent elements as possible while the condition holds. While iterating through the sorted array, we keep track of a “valid window” that starts at index i. If the current element a exceeds the allowed limit based on A[i], we effectively “remove” an element by incrementing i. Because we want the minimum removals, we are looking for the maximum number of elements we can keep.

Walkthrough: Understanding the Example

Example: nums = [1, 6, 2, 9], k = 3

  1. Sort the array → [1, 2, 6, 9].
  2. Initialize i = 0.
  3. Iterate:
    • a = 11 ≤ 1·3 → window [1], i stays 0.
    • a = 22 ≤ 1·3 → window [1, 2], i stays 0.
    • a = 66 > 1·3 → increment i to 1.
    • a = 9 → compare with new minimum 2: 9 > 2·3 → increment i to 2.

The final value of i is 2, meaning we need to remove 2 elements to obtain a balanced array.

Code Implementation

C++

class Solution {
public:
    int minRemoval(vector<int>& A, int k) {
        // Sort to easily identify min and max in any range
        sort(A.begin(), A.end());
        int i = 0;
        for (int a : A) {
            // If current element is too large for the current min at A[i]
            // we increment i, effectively shrinking the 'kept' count
            if (a > 1LL * A[i] * k) {
                i++;
            }
        }
        return i;
    }
};

Python

class Solution:
    def minRemoval(self, nums: List[int], k: int) -> int:
        # Sort the numbers to maintain a sliding window of valid elements
        nums.sort()
        i = 0
        for a in nums:
            # If the current max (a) exceeds min (nums[i]) * k, we must remove an element
            if a > nums[i] * k:
                i += 1
        return i

JavaScript

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
var minRemoval = function(nums, k) {
    // Sort numerically as JS default sort is lexicographical
    nums.sort((a, b) => a - b);
    let i = 0;
    for (let a of nums) {
        // Check if the current element violates the balance condition
        if (a > nums[i] * k) {
            i++;
        }
    }
    return i;
};

Key Takeaways

  • Sorting as Preprocessing: When a problem mentions “minimum” and “maximum” constraints, sorting often reduces the search space from (O(n^2)) to (O(n)).
  • Sliding Window Logic: Maintaining a pointer i lets you track the start of a valid range and count how many elements fall outside that range.
  • Integer Overflow: In C++, multiplying two large integers can exceed the int limit. Using 1LL (long long) ensures the multiplication is performed safely.

Final Thoughts

This problem illustrates how a “balanced” state is defined in real‑world systems. In load balancing for servers or financial portfolio risk management, we often need to ensure that no single entity is disproportionately larger than the others to prevent system failure or volatility. Mastering this sliding‑window logic helps you build systems that stay within safe operating parameters.

Back to Blog

Related posts

Read more »