给定一个由N个整数组成的数组arr [] ,任务是计算最大对数(arr [i],arr [j]) ,以使arr [i] + arr [j]为2的幂。
例子:
Input: arr[] = {1, -1, 2, 3}
Output: 5
Explanation: (1, 1), (2, 2), (1, 3), (-1, 3), (-1, 2) are the valid pairs whose sum is power of 2.
Input: arr[] = {1, 1, 1}
Output: 6
天真的方法:解决问题的最简单方法是从给定数组生成所有可能的对,并针对每个对检查该对的和是否为2的幂。
时间复杂度: O(N 2 )
辅助空间: O(1)
高效的方法:上面的方法可以使用HashMap进行优化。请按照以下步骤解决问题:
- 创建一个Map来存储数组arr []的每个元素的频率。
- 初始化一个变量ans,以存储总和等于2的幂的对的计数。
- 遍历范围[ 0,31 ]并生成2的所有幂,即2 0到2 31 。
- 遍历给定的数组,生成的每2的幂次,并检查map [key – arr [j]]是否存在,其中key等于2 i 。
- 如果发现是真的,则通过map [key-arr [j]]增加计数,因为存在一对(arr [j],key-arr [j]) ,且总和等于2的幂。
- 最后,将count / 2作为必需答案。
下面是上述方法的实现:
C++
// C++ program to implement
// the above approach
#include
using namespace std;
// Function to count all pairs
// whose sum is a power of two
int countPair(int arr[], int n)
{
// Stores the frequency of
// each element of the array
map m;
// Update frequency of
// array elements
for (int i = 0; i < n; i++)
m[arr[i]]++;
// Stores count of
// required pairs
int ans = 0;
for (int i = 0; i < 31; i++) {
// Current power of 2
int key = pow(2, i);
// Traverse the array
for (int j = 0; j < n; j++) {
int k = key - arr[j];
// If pair does not exist
if (m.find(k) == m.end())
continue;
// Increment count of pairs
else
ans += m[k];
if (k == arr[j])
ans++;
}
}
// Return the count of pairs
return ans / 2;
}
// Driver Code
int main()
{
int arr[] = { 1, 8, 2, 10, 6 };
int n = sizeof(arr) / sizeof(arr[0]);
cout << countPair(arr, n) << endl;
return 0;
}
Java
// Java program to implement
// the above approach
import java.util.*;
class GFG {
// Function to count all pairs
// whose sum is power of two
static int countPair(int[] arr, int n)
{
// Stores the frequency of
// each element of the array
Map m
= new HashMap<>();
// Update the frequency of
// array elements
for (int i = 0; i < n; i++)
m.put(arr[i], m.getOrDefault(
arr[i], 0)
+ 1);
// Stores the count of pairs
int ans = 0;
// Generate powers of 2
for (int i = 0; i < 31; i++) {
// Generate current power of 2
int key = (int)Math.pow(2, i);
// Traverse the array
for (int j = 0; j < arr.length;
j++) {
int k = key - arr[j];
// Increase ans by m[k], if
// pairs with sum 2^i exists
ans += m.getOrDefault(k, 0);
// Increase ans again if k = arr[j]
if (k == arr[j])
ans++;
}
}
// Return count of pairs
return ans / 2;
}
// Driver function
public static void main(String[] args)
{
int[] arr = { 1, -1, 2, 3 };
int n = arr.length;
System.out.println(countPair(arr, n));
}
}
Python3
# Python3 program to implement
# the above approach
from math import pow
# Function to count all pairs
# whose sum is a power of two
def countPair(arr, n):
# Stores the frequency of
# each element of the array
m = {}
# Update frequency of
# array elements
for i in range(n):
m[arr[i]] = m.get(arr[i], 0) + 1
# Stores count of
# required pairs
ans = 0
for i in range(31):
# Current power of 2
key = int(pow(2, i))
# Traverse the array
for j in range(n):
k = key - arr[j]
# If pair does not exist
if k not in m:
continue
# Increment count of pairs
else:
ans += m.get(k, 0)
if (k == arr[j]):
ans += 1
# Return the count of pairs
return ans // 2
# Driver Code
if __name__ == '__main__':
arr = [ 1, 8, 2, 10, 6 ]
n = len(arr)
print(countPair(arr, n))
# This code is contributed by SURENDRA_GANGWAR
输出:
5
时间复杂度: O(NlogN)
辅助空间: O(1)