📜  应删除以使数组良好的最小元素数

📅  最后修改于: 2021-10-26 02:29:16             🧑  作者: Mango

给定一个数组arr[] ,任务是找到必须删除以使数组良好的最小元素数。如果对于每个元素a i ,存在一个元素a j (i 不等于 j),使得a i + a j是 2 的幂,即某些元素2 d ,则序列 a 1 , a 2 … a n被称为良好非负整数 d.

例子:

方法:我们应该删除只有这样对其中不存在j(我不等于到j),使得I +一j是2的幂。
对于每个值,让我们找出它在数组中出现的次数。我们可以使用地图数据结构。

现在我们可以很容易地检查a i没有一对a j 。让我们迭代所有可能的总和, S = 2 0 , 2 1 , …, 2 30并为每个S计算S – a[i]它是否存在于地图中。

下面是上述方法的实现:

C++
// C++ implementation of the approach
#include 
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 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;
}


Java
// Java implementation of the approach
import java.util.*;
  
class GFG 
{
  
// Function to return the minimum number
// of elements that must be removed
// to make the given array good
static int minimumRemoval(int n, int a[])
{
  
    Map c = new HashMap<>();
  
    // Count frequency of each element
    for (int i = 0; i < n; i++)
        if(c.containsKey(a[i]))
        {
            c.put(a[i], c.get(a[i])+1);
        }
        else
        {
            c.put(a[i], 1);
        }
  
    int ans = 0;
  
    // For each element check if there
    // exists another element that makes
    // a valid pair
    for (int i = 0; i < n; i++) 
    {
        boolean ok = false;
        for (int j = 0; j < 31; j++)
        {
            int x = (1 << j) - a[i];
            if ((c.get(x) != null && (c.get(x) > 1)) ||
                c.get(x) != null && (c.get(x) == 1 && x != a[i])) 
            {
                ok = true;
                break;
            }
        }
  
        // If does not exist then
        // increment answer
        if (!ok)
            ans++;
    }
  
    return ans;
}
  
// Driver code
public static void main(String[] args)
{
    int a[] = { 4, 7, 1, 5, 4, 9 };
    int n = a.length;
    System.out.println(minimumRemoval(n, a));
}
}
  
/* This code contributed by PrinciRaj1992 */


Python3
# 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


C#
// C# implementation of the approach
using System.Linq;
using System;
  
class GFG
{
// Function to return the minimum number
// of elements that must be removed
// to make the given array good
static int minimumRemoval(int n, int []a)
{
  
    int[] c = new int[1000];
  
    // 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 = true;
        for (int j = 0; j < 31; j++) 
        {
            int x = (1 << j) - a[i];
            if (c.Contains(x) && (c[x] > 1 ||
                    (c[x] == 1 && x != a[i]))) 
            {
                ok = false;
                break;
            }
        }
  
        // If does not exist then
        // increment answer
        if (!ok)
            ans++;
    }
  
    return ans;
}
  
// Driver code
static void Main()
{
    int []a = { 4, 7, 1, 5, 4, 9 };
    int n = a.Length;
    Console.WriteLine(minimumRemoval(n, a));
}
}
  
// This code is contributed by mits


输出:
1