计算在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