Remove minimum elements from array so that max <= 2 * min

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: 1Remove 8 from the array.
Input: arr[] = {1, 2, 3, 4}Output: 1Remove 1 from the array.
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++
Python3
// C++ implementation of the approach#include <bits/stdc++.h>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 functionint main(){    int arr[] = { 4, 5, 3, 8, 3 };    int n = sizeof(arr) / sizeof(arr[0]);    cout << minimumRemovals(n, arr);    return 0;}
# Python3 implementation of the approachfrom 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 Codearr = [4, 5, 3, 8, 3]n = len(arr)print(minimumRemovals(n, arr))  # This code is contributed by Mohit Kumar
1

mohit kumar 29
cpp-map
Arrays
Binary Search Tree
Arrays
Binary Search Tree
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Maximum and minimum of an array using minimum number of comparisons
Top 50 Array Coding Problems for Interviews
Multidimensional Arrays in Java
Stack Data Structure (Introduction and Program)
Linear Search
Binary Search Tree | Set 1 (Search and Insertion)
AVL Tree | Set 1 (Insertion)
Binary Search Tree | Set 2 (Delete)
A program to check if a binary tree is BST or not
Construct BST from given preorder traversal | Set 1