给定一个由N 个正整数组成的数组 arr[] ,任务是计算数组中对的数量,比如 (a, b),使得a与其数字之和的总和等于b与其总和的总和的数字。
例子:
Input: arr[] = {1, 1, 2, 2}
Output: 2
Explanation:
Following are the pairs that satisfy the given criteria:
- (1, 1): The difference between 1 and 1 is 0 and the difference between their sum of digits is (1 – 1) = 0, which is equal.
- (1, 1): The difference between 2 and 2 is 0 and the difference between their sum of digits is (2 – 2) = 0, which is equal.
Therefore, the total number of pairs are 2.
Input: arr[] = {1, 2, 3, 4}
Output: 0
朴素方法:解决问题的最简单方法是生成给定数组的所有可能对,并对满足给定条件的那些对进行计数。检查所有对后,打印获得的对的总数。
时间复杂度: O(N 2 )
辅助空间: O(1)
高效方法:上述方法也可以通过将元素之和与其数字之和存储在 HashMap 中,然后计算相应形成的对的总数来优化上述方法。请按照以下步骤解决问题:
- 初始化一个 unordered_map, M存储元素总和的频率及其每个数组元素的数字总和。
- 遍历给定数组并增加(arr[i] + sumOfDigits(arr[i]))在映射M 中的频率。
- 初始化一个变量,比如count为0 ,它存储结果对的总数。
- 遍历给定的映射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 现场工作专业课程和学生竞争性编程现场课程。