给定一个数组arr [] ,任务是找到为使数组良好而必须删除的最小元素数。如果对于每个元素a i ,存在一个元素a j (i不等于j),使得a i + a j是2的幂,即2 d ,则序列a 1 ,a 2 …a n被称为好。非负整数d。
例子:
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
方法:我们应该删除只有这样的我对其中不存在第j(我不等于到j),使得I +一j是2的幂。
对于每个值,让我们找到其在数组中的出现次数。我们可以使用地图数据结构。
现在,我们可以很容易地检查一个我没有一对第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