计算在C ++中给定数组中存在总和的不重复对的数量

我们得到了一个由任意大小的整数值组成的arr []数组,任务是计算给定数组中总和也存在于同一数组中的不同对的数量。

数组是一种数据结构,可以存储相同类型的元素的固定大小的顺序集合。数组用于存储数据集合,但是将数组视为相同类型的变量集合通常会更有用。

要记住的要点

  • 不论顺序如何,对具有相同元素的一对都会被计数一次。例如,(3,2)和(2,3)将计为1。

  • 如果一个数组中多次出现一个数字,那么它将被精确地视为两次以形成一对。例如,如果一个数组的元素为{2,2,2,2},那么该对将为(2,2)并将其计为1。

例如

Input − int arr = {6, 4, 10, 14}Output − count is 2

解释-数组中总和为(6,4)和(10,4)的对,因此count为2

Input − int arr = {6, 6, 6 ,6, 6, 13}Output − count is 0

解释-数组中没有对,而同一数组中的和是对。因此,计数为0。

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

  • 比如说创建一个数组arr []

  • 使用length()函数将根据数组中的元素返回整数值来计算数组的长度。

  • 取一个临时变量来存储元素的数量。

  • 创建一个映射类型变量,假设为mp

  • i的开始循环为0,且我小于数组的大小

  • 创建另一个对类型变量的映射,比如说par

  • i的开始循环为0,且我小于数组的大小

  • 在循环内部,用j到i + 1且j小于数组的大小开始另一个循环

  • 在循环内部,检查mp [arr [i] + arr [j]]> 0和pr [{arr [i],arr [j]}] = = 0,然后将计数增加1

  • 将par [{arr [i],arr [j]}]递增1

  • 将par [{arr [j],arr [i]}]递增1

  • 返回计数

  • 打印结果。

示例

#include <iostream>
#include <map>
using namespace std;
//返回ar [0..n-1]中的对数
//总和等于“总和”
int countpairs(int ar[], int n){
   //将所有元素的计数存储在映射m-
   //查找对(ar [i],sum-ar [i])
   //因为(ar [i])+(sum-ar [i])=和
   map<int, int> mymap;
   for (int i = 0; i < n; i++){
      mymap[ar[i]]++;
   }
   //要删除重复项,我们使用结果图
   map<pair<int, int>, int> p;
   int result = 0;
   //考虑所有对
   for (int i = 0; i < n; i++){
      for (int j = i + 1; j < n; j++){
         //如果当前对的总和存在
         if (mymap[ar[i] + ar[j]] > 0 && p[{ ar[i], ar[j] }] ==0){
            result++;
         }
         //双向插入当前对避免
         //重复。
         p[{ ar[i], ar[j] }]++;
         p[{ ar[j], ar[i] }]++;
      }
   }
   return result;
}
//主要功能
int main(){
   int ar[] = { 6, 4, 10, 14 };
   int n = sizeof(ar) / sizeof(ar[0]);
   cout << "count is "<<countpairs(ar, n);
   return 0;
}

输出结果

如果运行上面的代码,我们将获得以下输出-

count is 2