在C ++中使得i
我们给了一个包含整数元素的数组。目标是找到数组元素的唯一对,以使类型对(arr[i],arr[j])的索引使得i
让我们用例子来理解
输入−arr[]={1,2,3};
输出-唯一对(arr[i],arr[j])的计数,使得i<j为−3
说明-由于所有元素都是唯一的。对将是-
(1,2) - ( arr[0],arr[1] ) 0<1 (1,3) - ( arr[0], arr[2] ) 0<2 (2,3) - ( arr[1],arr[2] ) 1<2
输入−arr[]={4,4,3,2};
输出-唯一对(arr[i],arr[j])的计数,使得i<j为−4
说明-由于所有元素都是唯一的。对将是-
(4,4) - ( arr[0],arr[1] ) 0<1 (4,3) - ( arr[0], arr[2] ) 0<2 (4,2) - ( arr[0],arr[3] ) 0<3 (3,2) - ( arr[2],arr[3] ) 2<3
以下程序中使用的方法如下
我们将使用两种方法。第一种使用for循环的幼稚方法。使用两个for循环开始遍历数组arr[]。从i=0到i<length-1,从j=i+1到j<length。这样,i<j。现在添加对(arr[i],arr[j])来设置<pair<int,int>>se;在“se”的末尾,大小为i<j的唯一对的数量。
将整数数组arr[]与整数元素和长度作为大小
函数unique_pair(intarr[],intsize)接受数组及其长度,并返回唯一对的数量,使得成对(arr[i],arr[j])中的索引i<j
将count的初始值设为0。
取一个包含整数对的“se”集。(set<pair<int,int>>se)
使用两个for循环开始遍历arr[]。从i=0到i<size-1,从j=i+1到j<size。
对于每对总是i<j,使用se.insert(make_pair(arr[i],arr[j]))将对(arr[i],arr[j])添加到'se'。
在两个for循环的末尾,更新count=se.size()。
Count现在在“se”中有许多对。(所有都是唯一的)。
返回计数作为结果。
高效方法
通过这种方法,我们将在每个元素之后找到唯一的元素。arr[i]将与从arr[i+1到size-1]的不同/唯一元素配对。因此,如果在arr[i]之后有x个唯一元素,则arr[i]将构成x对。因此,我们将首先创建一个在索引i之后标记唯一元素的数组。然后,将这样的计数相加,得出总的唯一对。
将整数数组arr[]与整数元素和长度作为大小
函数unique_pair(intarr[],intsize)接受数组及其长度,并返回唯一对的数量,使得成对(arr[i],arr[j])中的索引i<j
将count的初始值设为0。
取temp变量并将其设置为0。
取长度为arr_2[]的数组并初始化arr_2[size-1]=0,因为最后一个元素后面有0个唯一元素。
创建两个整数集,选中和取消选中。
从最后一个元素到first.i=size-1到i>=0遍历数组。在设置检查中搜索arr[i]。
如果找不到,那么它是唯一的。递增温度(temp是arr[i]之后的唯一元素的计数)。设置arr_2[i]=temp。
否则arr_2[i]=temp。温度没有增加。
插入arr[i]以设置检查。现在将不考虑下一次出现的arr[i]。
在此for循环结束之后。arr_2[]已更新。
现在从索引i=0遍历arr[]到i<size-1。对于每个arr[i],请检查是否已设置为uncheck。如果不是,则第一次出现arr[i],添加arr_2[i](在arr[i]之后的唯一元素)进行计数。否则,什么也不做,继续。
添加arr[i]设置为取消选中。现在将不再考虑下一次出现arr[i]。
最后,计数具有唯一对,因此对于唯一对(arr[i],arr[j]),i<j。
返回计数作为结果。
示例(幼稚的方法)
#include<bits/stdc++.h> using namespace std; int unique_pair(int arr[], int size){ int count = 0; set<pair<int, int>> se; for(int i = 0; i < (size - 1); i++){ for (int j = i + 1; j < size; j++){ se.insert(make_pair(arr[i], arr[j])); } } count = se.size(); return count; } int main(){ int arr[] = { 4, 3, 1, 6, 7 }; int size = sizeof(arr) / sizeof(arr[0]); cout<<"Count of unique pairs (arr[i], arr[j]) such that i < j are: "<<unique_pair(arr, size); return 0; }
输出结果
如果我们运行上面的代码,它将生成以下输出-
Count of unique pairs (arr[i], arr[j]) such that i & j are: 10
示例(有效方法)
#include<bits/stdc++.h> using namespace std; int unique_pair(int arr[], int size){ int count = 0, temp = 0; int arr_2[size]; arr_2[size-1] = 0; set<int> check, uncheck; for (int i = size - 1; i > 0; i--){ auto set = check.find(arr[i]); if (set != check.end()){ arr_2[i - 1] = temp; } else{ arr_2[i - 1] = ++temp; } check.insert(arr[i]); } for (int i = 0; i < size - 1; i++){ auto set = uncheck.find(arr[i]); if (set != uncheck.end()){ continue; } count += arr_2[i]; uncheck.insert(arr[i]); } return count; } int main(){ int arr[] = { 4, 3, 1, 6, 7 }; int size = sizeof(arr)/sizeof(arr[0]); cout<<"Count of unique pairs (arr[i], arr[j]) such that i < j are: "<<unique_pair(arr, size); return 0; }
输出结果
如果我们运行上面的代码,它将生成以下输出-
Count of unique pairs (arr[i], arr[j]) such that i < j are: 10