Related Articles
Remove minimum elements from array so that max <= 2 * min
• Difficulty Level : Medium
• Last Updated : 27 Dec, 2019

Given an array arr, the task is to remove minimum number of elements such that after their removal, max(arr) <= 2 * min(arr).

Examples:

Input: arr[] = {4, 5, 3, 8, 3}
Output: 1
Remove 8 from the array.

Input: arr[] = {1, 2, 3, 4}
Output: 1
Remove 1 from the array.

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

Approach: Let us fix each value as the minimum value say x and find number of terms that are in range [x, 2*x]. This can be done using prefix-sums, we can use map (implements self balancing BST) instead of array as the values can be large. The remaining terms which are not in range [x, 2*x] will have to be removed. So, across all values of x, we choose the one which maximises the number of terms in range [x, 2*x].

Below is the implementation of the above approach:

## C++

 `// C++ implementation of the approach ` `#include ` `using` `namespace` `std; ` ` `  `// Function to return the minimum removals from  ` `// arr such that max(arr) <= 2 * min(arr) ` `int` `minimumRemovals(``int` `n, ``int` `a[]) ` `{ ` `    ``// Count occurrence of each element ` `    ``map<``int``, ``int``> ct; ` `    ``for` `(``int` `i = 0; i < n; i++) ` `        ``ct[a[i]]++; ` ` `  `    ``// Take prefix sum ` `    ``int` `sm = 0; ` `    ``for` `(``auto` `mn : ct) { ` `        ``sm += mn.second; ` `        ``ct[mn.first] = sm; ` `    ``} ` ` `  `    ``int` `mx = 0, prev = 0; ` `    ``for` `(``auto` `mn : ct) { ` ` `  `        ``// Chosen minimum ` `        ``int` `x = mn.first; ` `        ``int` `y = 2 * x; ` `        ``auto` `itr = ct.upper_bound(y); ` `        ``itr--; ` ` `  `        ``// Number of elements that are in ` `        ``// range [x, 2x] ` `        ``int` `cr = (itr->second) - prev; ` `        ``mx = max(mx, cr); ` `        ``prev = mn.second; ` `    ``} ` ` `  `    ``// Minimum elements to be removed ` `    ``return` `n - mx; ` `} ` ` `  `// Driver Program to test above function ` `int` `main() ` `{ ` `    ``int` `arr[] = { 4, 5, 3, 8, 3 }; ` `    ``int` `n = ``sizeof``(arr) / ``sizeof``(arr); ` `    ``cout << minimumRemovals(n, arr); ` `    ``return` `0; ` `} `

## Python3

 `# Python3 implementation of the approach ` `from` `bisect ``import` `bisect_left as upper_bound ` ` `  `# Function to return the minimum removals from ` `# arr such that max(arr) <= 2 * min(arr) ` `def` `minimumRemovals(n, a): ` `     `  `    ``# Count occurrence of each element ` `    ``ct ``=` `dict``() ` `    ``for` `i ``in` `a: ` `        ``ct[i] ``=` `ct.get(i, ``0``) ``+` `1` ` `  `    ``# Take prefix sum ` `    ``sm ``=` `0` `    ``for` `mn ``in` `ct: ` `        ``sm ``+``=` `ct[mn] ` `        ``ct[mn] ``=` `sm ` ` `  `    ``mx ``=` `0` `    ``prev ``=` `0``; ` `    ``for` `mn ``in` `ct: ` ` `  `        ``# Chosen minimum ` `        ``x ``=` `mn ` `        ``y ``=` `2` `*` `x ` `        ``itr ``=` `upper_bound(``list``(ct), y) ` ` `  `        ``# Number of elements that are in ` `        ``# range [x, 2x] ` `        ``cr ``=` `ct[itr] ``-` `prev ` `        ``mx ``=` `max``(mx, cr) ` `        ``prev ``=` `ct[mn] ` ` `  `    ``# Minimum elements to be removed ` `    ``return` `n ``-` `mx ` ` `  `# Driver Code ` `arr ``=` `[``4``, ``5``, ``3``, ``8``, ``3``] ` `n ``=` `len``(arr) ` `print``(minimumRemovals(n, arr)) ` ` `  `# This code is contributed by Mohit Kumar `

Output:

```1
```

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.

My Personal Notes arrow_drop_up
Recommended Articles
Page :