📌  相关文章
📜  计数对,它们的总和仅由设置的位组成

📅  最后修改于: 2021-04-29 11:33:51             🧑  作者: Mango

给定一个由N个整数组成的数组arr [] ,任务是查找给定数组中无序对的计数,该数组的总和包含所有设置位。

例子:

天真的方法:想法是生成所有可能的对,并检查它们的总和是否设置了所有位。如果发现是真的,则在结果计数中计算该对。检查所有对后,打印计数。

下面是上述方法的实现:

C++
// C++ program for the above approach
#include 
using namespace std;
 
// Function to check if the number num
// has all set bits or not
bool allSetBits(int num)
{
    // Find total bitsac
    int totalBits = log2(num) + 1;
 
    // Find count of set bit
    int setBits = __builtin_popcount(num);
 
    // Return true if all bit are set
    if (totalBits == setBits)
        return true;
    else
        return false;
}
 
// Function that find the count of
// pairs whose sum has all set bits
int countPairs(int arr[], int n)
{
    // Stores the count of pairs
    int ans = 0;
 
    // Generate all the pairs
    for (int i = 0; i < n; i++) {
 
        for (int j = i + 1; j < n; j++) {
 
            // Find the sum of current pair
            int sum = arr[i] + arr[j];
 
            // If all bits are set
            if (allSetBits(sum))
                ans++;
        }
    }
 
    // Return the final count
    return ans;
}
 
// Driver Code
int main()
{
    int arr[] = { 1, 2, 5, 10 };
    int N = sizeof(arr) / sizeof(arr[0]);
 
    // Function Call
    cout << countPairs(arr, N);
 
    return 0;
}


Java
// Java program for the
// above approach
import java.util.*;
class GFG{
 
// Function to check if the
// number num has all set
// bits or not
static boolean allSetBits(int num)
{
  // Find total bitsac
  int totalBits = (int)Math.log(num) + 1;
 
  // Find count of set bit
  int setBits = Integer.bitCount(num);
 
  // Return true if all
  // bit are set
  if (totalBits == setBits)
    return true;
  else
    return false;
}
 
// Function that find the
// count of pairs whose sum
// has all set bits
static int countPairs(int arr[],
                      int n)
{
  // Stores the count
  // of pairs
  int ans = 0;
 
  // Generate all the pairs
  for (int i = 0; i < n; i++)
  {
    for (int j = i + 1; j < n; j++)
    {
      // Find the sum of
      // current pair
      int sum = arr[i] + arr[j];
 
      // If all bits are set
      if (allSetBits(sum))
        ans++;
    }
  }
 
  // Return the final count
  return ans;
}
 
// Driver Code
public static void main(String[] args)
{
  int arr[] = {1, 2, 5, 10};
  int N = arr.length;
 
  // Function Call
  System.out.print(countPairs(arr, N));
}
}
 
// This code is contributed by gauravrajput1


Python3
# Python3 program for the above approach
from math import log2
 
# Function to check if the number num
# has all set bits or not
def allSetBits(num):
     
    # Find total bits
    totalBits = int(log2(num) + 1)
 
    # Find count of set bit
    setBits = bin(num).count('1')
 
    # Return true if all bit are set
    if (totalBits == setBits):
        return True
    else:
        return False
 
# Function that find the count of
# pairs whose sum has all set bits
def countPairs(arr, n):
     
    # Stores the count of pairs
    ans = 0
 
    # Generate all the pairs
    for i in range(n):
        for j in range(i + 1, n):
 
            # Find the sum of current pair
            sum = arr[i] + arr[j]
 
            # If all bits are set
            if (allSetBits(sum)):
                ans += 1
 
    # Return the final count
    return ans
 
# Driver Code
if __name__ == '__main__':
     
    arr = [ 1, 2, 5, 10 ]
    N = len(arr)
 
    # Function Call
    print(countPairs(arr, N))
 
# This code is contributed by mohit kumar 29


C#
// C# program for the
// above approach
using System;
class GFG{
 
static int countSetBits(int n)
{
  int count = 0;
   
  while (n > 0)
  {
    count += n & 1;
    n >>= 1;
  }
  return count;
}
   
// Function to check if the
// number num has all set
// bits or not
static bool allSetBits(int num)
{
  // Find total bitsac
  int totalBits = (int)Math.Log(num) + 1;
 
  // Find count of set bit
  int setBits = countSetBits(num);
 
  // Return true if all
  // bit are set
  if (totalBits == setBits)
    return true;
  else
    return false;
}
 
// Function that find the
// count of pairs whose sum
// has all set bits
static int countPairs(int []arr,
                      int n)
{
  // Stores the count
  // of pairs
  int ans = 0;
 
  // Generate all the pairs
  for (int i = 0; i < n; i++)
  {
    for (int j = i + 1; j < n; j++)
    {
      // Find the sum of
      // current pair
      int sum = arr[i] + arr[j];
 
      // If all bits are set
      if (allSetBits(sum))
        ans++;
    }
  }
 
  // Return the readonly count
  return ans;
}
 
// Driver Code
public static void Main(String[] args)
{
  int []arr = {1, 2, 5, 10};
  int N = arr.Length;
 
  // Function Call
  Console.Write(countPairs(arr, N));
}
}
 
// This code is contributed by Princi Singh


C++
// C++ program for the above approach
 
#include 
using namespace std;
 
// Store numbers having all set bits
vector setArray;
 
// Store frequency of values in arr[]
map mp;
 
// Function to fill setArray[] with
// numbers that have all set bits
void fillsetArray()
{
    for (int i = 1; i < 31; i++) {
        setArray.push_back((1 << i) - 1);
    }
}
 
// Function to find the count of pairs
// whose sum contains all set bits
int countPairs(int arr[], int n)
{
    // Stores the count of pairs
    int ans = 0;
 
    fillsetArray();
 
    // Hash the values of arr[] in mp
    for (int i = 0; i < n; i++)
        mp[arr[i]]++;
 
    // Traverse the array arr[]
    for (int i = 0; i < n; i++) {
 
        // Iterate over the range [0, 30]
        for (int j = 0; j < 30; j++) {
 
            // Find the difference
            int value = setArray[j] - arr[i];
 
            // Update the final count
            ans += mp[value];
        }
    }
 
    // Return the final count
    return ans / 2;
}
 
// Driver Code
int main()
{
    int arr[] = { 1, 2, 5, 10 };
    int N = sizeof(arr) / sizeof(arr[0]);
 
    // Function Call
    cout << countPairs(arr, N);
 
    return 0;
}


Java
// Java program for the
// above approach
import java.util.*;
class GFG{
 
// Store numbers having
// all set bits
static Vector setArray =
              new Vector<>();
 
// Store frequency of
// values in arr[]
static HashMap mp = new HashMap();
   
// Function to fill setArray[]
// with numbers that have all
// set bits
static void fillsetArray()
{
  for (int i = 1; i < 31; i++)
  {
    setArray.add((1 << i) - 1);
  }
}
 
// Function to find the count
// of pairs whose sum contains
// all set bits
static int countPairs(int arr[],
                      int n)
{
  // Stores the count
  // of pairs
  int ans = 0;
 
  fillsetArray();
 
  // Hash the values of
  // arr[] in mp
  for (int i = 0; i < n; i++)
    if(mp.containsKey(arr[i]))
    {
      mp.put(arr[i],
             mp.get(arr[i]) + 1);
    }
    else
    {
      mp.put(arr[i], 1);
    }
 
  // Traverse the array arr[]
  for (int i = 0; i < n; i++)
  {
    // Iterate over the range
    // [0, 30]
    for (int j = 0; j < 30; j++)
    {
      // Find the difference
      int value = setArray.get(j) -
        arr[i];
 
      // Update the final count
      if(mp.containsKey(value))
        ans += mp.get(value);
    }
  }
 
  // Return the final count
  return ans / 2;
}
 
// Driver Code
public static void main(String[] args)
{
  int arr[] = {1, 2, 5, 10};
  int N = arr.length;
 
  // Function Call
  System.out.print(countPairs(arr, N));
}
}
 
// This code is contributed by Rajput-Ji


Python3
# Python3 program for the
# above approach
from collections import defaultdict
 
# Store numbers having
# all set bits
setArray = []
 
# Store frequency of values
# in arr[]
mp = defaultdict (int)
 
# Function to fill setArray[] with
# numbers that have all set bits
def fillsetArray():
 
    for i in range (1, 31):
        setArray.append((1 << i) - 1)
     
# Function to find the
# count of pairs whose sum
# contains all set bits
def countPairs(arr, n):
 
    # Stores the count of pairs
    ans = 0
 
    fillsetArray()
 
    # Hash the values of
    # arr[] in mp
    for i in range (n):
        mp[arr[i]] += 1
 
    # Traverse the array arr[]
    for i in range (n):
 
        # Iterate over the range
        # [0, 30]
        for j in range (30):
 
            # Find the difference
            value = setArray[j] - arr[i]
 
            # Update the final count
            ans += mp[value]
        
    # Return the final count
    return ans // 2
 
# Driver Code
if __name__ == "__main__":
   
    arr = [1, 2, 5, 10]
    N = len(arr)
 
    # Function Call
    print (countPairs(arr, N))
 
# This code is contributed by Chitranayal


C#
// C# program for the
// above approach
using System;
using System.Collections.Generic;
 
class GFG{
 
// Store numbers having
// all set bits
static List setArray = new List();
 
// Store frequency of
// values in []arr
static Dictionary mp = new Dictionary();
   
// Function to fill setArray[]
// with numbers that have all
// set bits
static void fillsetArray()
{
  for(int i = 1; i < 31; i++)
  {
    setArray.Add((1 << i) - 1);
  }
}
 
// Function to find the count
// of pairs whose sum contains
// all set bits
static int countPairs(int []arr,
                      int n)
{
   
  // Stores the count
  // of pairs
  int ans = 0;
 
  fillsetArray();
 
  // Hash the values of
  // []arr in mp
  for(int i = 0; i < n; i++)
    if(mp.ContainsKey(arr[i]))
    {
      mp.Add(arr[i],
          mp[arr[i]] + 1);
    }
    else
    {
      mp.Add(arr[i], 1);
    }
 
  // Traverse the array []arr
  for(int i = 0; i < n; i++)
  {
     
    // Iterate over the range
    // [0, 30]
    for(int j = 0; j < 30; j++)
    {
       
      // Find the difference
      int value = setArray[j] -
                       arr[i];
 
      // Update the readonly count
      if (mp.ContainsKey(value))
        ans += mp[value];
    }
  }
   
  // Return the readonly count
  return ans / 2;
}
 
// Driver Code
public static void Main(String[] args)
{
  int []arr = {1, 2, 5, 10};
  int N = arr.Length;
 
  // Function Call
  Console.Write(countPairs(arr, N));
}
}
 
// This code is contributed by Princi Singh


输出
3



时间复杂度: O(N 2 log N),其中N是给定数组的大小。
辅助空间: O(N)

高效方法:主要观察结果是,只有0个N个对数N个数字,其中包含所有设置的位。此属性可用于优化上述方法。请按照以下步骤解决问题:

  • 将所有log(MAX_INTEGER)元素存储在数组setArray []中
  • 将数组arr []的所有元素映射到Map数据结构中,其中元素是键,其频率是值。
  • 遍历范围为[0,N – 1]的给定数组arr [] 并在嵌套循环中遍历数组setArray []j = 0到log(MAX_INTEGER),并通过map [setArray [j] – arr [i]递增ans ]] ,其中ans存储所需对的总数。
  • 由于存在重复计数,因为(a,b)(b,a)被计数了两次。因此,打印ans / 2的值以获得所需的计数。

下面是上述方法的实现:

C++

// C++ program for the above approach
 
#include 
using namespace std;
 
// Store numbers having all set bits
vector setArray;
 
// Store frequency of values in arr[]
map mp;
 
// Function to fill setArray[] with
// numbers that have all set bits
void fillsetArray()
{
    for (int i = 1; i < 31; i++) {
        setArray.push_back((1 << i) - 1);
    }
}
 
// Function to find the count of pairs
// whose sum contains all set bits
int countPairs(int arr[], int n)
{
    // Stores the count of pairs
    int ans = 0;
 
    fillsetArray();
 
    // Hash the values of arr[] in mp
    for (int i = 0; i < n; i++)
        mp[arr[i]]++;
 
    // Traverse the array arr[]
    for (int i = 0; i < n; i++) {
 
        // Iterate over the range [0, 30]
        for (int j = 0; j < 30; j++) {
 
            // Find the difference
            int value = setArray[j] - arr[i];
 
            // Update the final count
            ans += mp[value];
        }
    }
 
    // Return the final count
    return ans / 2;
}
 
// Driver Code
int main()
{
    int arr[] = { 1, 2, 5, 10 };
    int N = sizeof(arr) / sizeof(arr[0]);
 
    // Function Call
    cout << countPairs(arr, N);
 
    return 0;
}

Java

// Java program for the
// above approach
import java.util.*;
class GFG{
 
// Store numbers having
// all set bits
static Vector setArray =
              new Vector<>();
 
// Store frequency of
// values in arr[]
static HashMap mp = new HashMap();
   
// Function to fill setArray[]
// with numbers that have all
// set bits
static void fillsetArray()
{
  for (int i = 1; i < 31; i++)
  {
    setArray.add((1 << i) - 1);
  }
}
 
// Function to find the count
// of pairs whose sum contains
// all set bits
static int countPairs(int arr[],
                      int n)
{
  // Stores the count
  // of pairs
  int ans = 0;
 
  fillsetArray();
 
  // Hash the values of
  // arr[] in mp
  for (int i = 0; i < n; i++)
    if(mp.containsKey(arr[i]))
    {
      mp.put(arr[i],
             mp.get(arr[i]) + 1);
    }
    else
    {
      mp.put(arr[i], 1);
    }
 
  // Traverse the array arr[]
  for (int i = 0; i < n; i++)
  {
    // Iterate over the range
    // [0, 30]
    for (int j = 0; j < 30; j++)
    {
      // Find the difference
      int value = setArray.get(j) -
        arr[i];
 
      // Update the final count
      if(mp.containsKey(value))
        ans += mp.get(value);
    }
  }
 
  // Return the final count
  return ans / 2;
}
 
// Driver Code
public static void main(String[] args)
{
  int arr[] = {1, 2, 5, 10};
  int N = arr.length;
 
  // Function Call
  System.out.print(countPairs(arr, N));
}
}
 
// This code is contributed by Rajput-Ji

Python3

# Python3 program for the
# above approach
from collections import defaultdict
 
# Store numbers having
# all set bits
setArray = []
 
# Store frequency of values
# in arr[]
mp = defaultdict (int)
 
# Function to fill setArray[] with
# numbers that have all set bits
def fillsetArray():
 
    for i in range (1, 31):
        setArray.append((1 << i) - 1)
     
# Function to find the
# count of pairs whose sum
# contains all set bits
def countPairs(arr, n):
 
    # Stores the count of pairs
    ans = 0
 
    fillsetArray()
 
    # Hash the values of
    # arr[] in mp
    for i in range (n):
        mp[arr[i]] += 1
 
    # Traverse the array arr[]
    for i in range (n):
 
        # Iterate over the range
        # [0, 30]
        for j in range (30):
 
            # Find the difference
            value = setArray[j] - arr[i]
 
            # Update the final count
            ans += mp[value]
        
    # Return the final count
    return ans // 2
 
# Driver Code
if __name__ == "__main__":
   
    arr = [1, 2, 5, 10]
    N = len(arr)
 
    # Function Call
    print (countPairs(arr, N))
 
# This code is contributed by Chitranayal

C#

// C# program for the
// above approach
using System;
using System.Collections.Generic;
 
class GFG{
 
// Store numbers having
// all set bits
static List setArray = new List();
 
// Store frequency of
// values in []arr
static Dictionary mp = new Dictionary();
   
// Function to fill setArray[]
// with numbers that have all
// set bits
static void fillsetArray()
{
  for(int i = 1; i < 31; i++)
  {
    setArray.Add((1 << i) - 1);
  }
}
 
// Function to find the count
// of pairs whose sum contains
// all set bits
static int countPairs(int []arr,
                      int n)
{
   
  // Stores the count
  // of pairs
  int ans = 0;
 
  fillsetArray();
 
  // Hash the values of
  // []arr in mp
  for(int i = 0; i < n; i++)
    if(mp.ContainsKey(arr[i]))
    {
      mp.Add(arr[i],
          mp[arr[i]] + 1);
    }
    else
    {
      mp.Add(arr[i], 1);
    }
 
  // Traverse the array []arr
  for(int i = 0; i < n; i++)
  {
     
    // Iterate over the range
    // [0, 30]
    for(int j = 0; j < 30; j++)
    {
       
      // Find the difference
      int value = setArray[j] -
                       arr[i];
 
      // Update the readonly count
      if (mp.ContainsKey(value))
        ans += mp[value];
    }
  }
   
  // Return the readonly count
  return ans / 2;
}
 
// Driver Code
public static void Main(String[] args)
{
  int []arr = {1, 2, 5, 10};
  int N = arr.Length;
 
  // Function Call
  Console.Write(countPairs(arr, N));
}
}
 
// This code is contributed by Princi Singh
输出
3



时间复杂度: O(N * 32),其中N是给定数组的大小。
辅助空间: O(N)