Minimum number of elements that should be removed to make the array good

Given an array arr[], the task is to find the minimum number of elements that must be removed to make the array good. A sequence a1, a2 … an is called good if for each element ai, there exists an element aj (i not equals to j) such that ai + aj is a power of two i.e. 2d for some non-negative integer d.

Examples:

Input: arr[] = {4, 7, 1, 5, 4, 9}
Output: 1
Remove 5 from the array to make the array good.

Input: arr[] = {1, 3, 1, 1}
Output: 0



Approach: We should delete only such ai for which there is no aj (i not equals to j) such that ai + aj is a power of 2.
For each value let’s find the number of its occurrences in the array. We can use the map data-structure.

Now we can easily check that ai doesn’t have a pair aj. Let’s iterate over all possible sums, S = 20, 21, …, 230 and for each S calculate S – a[i] whether it exists in the map.

Below is the implementation of the above approach :

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
  
// Function to return the minimum number
// of elements that must be removed
// to make the given array good
int minimumRemoval(int n, int a[])
{
  
    map<int, int> c;
  
    // Count frequency of each element
    for (int i = 0; i < n; i++)
        c[a[i]]++;
  
    int ans = 0;
  
    // For each element check if there
    // exists another element that makes
    // a valid pair
    for (int i = 0; i < n; i++) {
        bool ok = false;
        for (int j = 0; j < 31; j++) {
            int x = (1 << j) - a[i];
            if (c.count(x) && (c[x] > 1
                       || (c[x] == 1 && x != a[i]))) {
                ok = true;
                break;
            }
        }
  
        // If does not exist then
        // increment answer
        if (!ok)
            ans++;
    }
  
    return ans;
}
  
// Driver code
int main()
{
    int a[] = { 4, 7, 1, 5, 4, 9 };
    int n = sizeof(a) / sizeof(a[0]);
    cout << minimumRemoval(n, a);
  
    return 0;
}

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 implementation of the approach 
  
# Function to return the minimum number 
# of elements that must be removed 
# to make the given array good 
def minimumRemoval(n, a) :
  
    c = dict.fromkeys(a, 0);
  
    # Count frequency of each element 
    for i in range(n) :
        c[a[i]] += 1
  
    ans = 0
  
    # For each element check if there 
    # exists another element that makes 
    # a valid pair 
    for i in range(n) :
        ok = False
        for j in range(31) :
              
            x = (1 << j) - a[i]; 
            if (x in c and (c[x] > 1 or 
               (c[x] == 1 and x != a[i]))) :
                  
                ok = True
                break;
  
        # If does not exist then 
        # increment answer 
        if (not ok) :
            ans += 1
              
    return ans; 
  
# Driver Code
if __name__ == "__main__" :
      
    a = [ 4, 7, 1, 5, 4, 9 ]; 
    n = len(a) ; 
      
    print(minimumRemoval(n, a));
      
# This code is contributed by Ryuga

chevron_right


Output:

1


My Personal Notes arrow_drop_up

pawanasipugmailcom

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.