计算数组中的对,使得 C++ 中一个的频率至少是另一个的值

我们得到一个正整数数组。目标是找到 arr[] 元素对的计数,使得元素对具有元素 ( A, B ),其中 A 的频率是 B 次,B 的频率是 A。

让我们通过例子来理解。

输入- int arr[] = { 3, 3, 3, 5, 5, 6, 6}

输出- 数组中对的计数,使得一个的频率至少是另一个的值 - 1

说明- 数组中 A 出现 B 次且 B 出现 A 次的有效对是 (3, 3),因为 3 在数组中出现 3 次。所以只有一对有效,因此计数为 1。

输入- int arr[] = { 3, 3, 3, 3, 3, 5, 5, 5, 6, 6}

输出- 数组中对的计数,使得一个的频率至少是另一个的值 - 1

说明- 数组中 A 出现 B 次且 B 出现 A 次的有效对是 (3, 3), (5, 5) 和 (3, 5) 因为 3 出现 5 次,5 出现 3 次大批。所以有三个有效对,因此计数为 3。

下面程序中使用的方法如下

在该方法中,我们首先创建并填充一个包含数组元素频率的无序映射。使用 for 循环遍历 unordered_map。对于每个元素及其频率,如果发现更多频率,则增加对的计数。

  • 取一个整数数组 arr[] 。

  • 函数 frequency_other_value(int arr[], int size) 获取数组及其大小并返回对的计数,使得对是 (A,B) 其中 A 至少出现 B 次,反之亦然。

  • 取初始计数为 0。

  • 对 arr[] 的元素及其频率取 unordered_map<int, int> um。

  • 使用 for 和 for 每对 start=it.second 的第一个值遍历映射;(it=iterator), 遍历频率 >= 开始使用 for 循环的映射。

  • 此类对的增量计数。

  • 返回计数作为结果。

示例

#include <bits/stdc++.h>
using namespace std;
int frequency_other_value(int arr[], int len){
   int count = 0;
   unordered_map<int, int> um;
   for (int i = 0; i < len; ++i){
      um[arr[i]]++;
   }
   for (auto it : um){
      int start = it.first;
      int end = it.second;
      for (int j = 1; j <= end; j++){
         if (um[j] >= start){
            count++;
         }
      }
   }
   return count;
}
int main(){
   int arr[] = { 3, 3, 3, 5, 5, 6, 6};
   int size = sizeof(arr) / sizeof(arr[0]);
   cout<<"数组中对的计数使得一个的频率至少是另一个的值是: "<<frequency_other_value(arr, size);
   return 0;
}
输出结果

如果我们运行上面的代码,它将生成以下输出 -

数组中对的计数使得一个的频率至少是另一个的值是: 1

猜你喜欢