📌  相关文章
📜  计算数组中具有元素总和且它们各自的数字总和相等的对

📅  最后修改于: 2021-10-27 08:18:55             🧑  作者: Mango

给定一个由N 个正整数组成的数组 arr[] ,任务是计算数组中对的数量,比如 (a, b),使得a与其数字之和的总和等于b与其总和的总和的数字。

例子:

朴素方法:解决问题的最简单方法是生成给定数组的所有可能对,并对满足给定条件的那些对进行计数。检查所有对后,打印获得的对的总数。

时间复杂度: O(N 2 )
辅助空间: O(1)

高效方法:上述方法也可以通过将元素之和与其数字之和存储在 HashMap 中,然后计算相应形成的对的总数来优化上述方法。请按照以下步骤解决问题:

  • 初始化一个 unordered_map, M存储元素总和的频率及其每个数组元素的数字总和。
  • 遍历给定数组并增加(arr[i] + sumOfDigits(arr[i]))在映射M 中的频率。
  • 初始化一个变量,比如count0 ,它存储结果对的总数。
  • 遍历给定的映射M并且如果任何元素的频率,例如F大于2 ,则将 count的值增加(F*(F – 1))/2
  • 完成上述步骤后,打印count的值作为结果对的计数。

下面是上述方法的实现:

C++
// C++ program for the above approach
  
#include 
using namespace std;
  
// Function to find the sum of digits
// of the number N
int sumOfDigits(int N)
{
    // Stores the sum of digits
    int sum = 0;
  
    // If the number N is greater than 0
    while (N) {
        sum += (N % 10);
        N = N / 10;
    }
  
    // Return the sum
    return sum;
}
  
// Function to find the count of pairs
// such that arr[i] - digitSum(arr[j])
// is (arr[j] - digitSum(arr[i])
int CountPair(int arr[], int n)
{
    // Stores the frequency of value
    // of arr[i] - digitSum(arr[j])
    unordered_map mp;
  
    // Traverse the given array
    for (int i = 0; i < n; i++) {
  
        // Find the value
        int val = arr[i] + sumOfDigits(arr[i]);
  
        // Increment the frequency
        mp[val]++;
    }
  
    // Stores the total count of pairs
    int count = 0;
  
    // Traverse the map mp
    for (auto x : mp) {
  
        int val = x.first;
        int times = x.second;
  
        // Update the count of pairs
        count += ((times * (times - 1)) / 2);
    }
  
    // Return the total count of pairs
    return count;
}
  
// Driver Code
int main()
{
    int arr[] = { 105, 96, 20, 2, 87, 96 };
    int N = sizeof(arr) / sizeof(arr[0]);
    cout << CountPair(arr, N);
  
    return 0;
}


输出:
3

时间复杂度: O(N)
辅助空间: O(N)

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程。