C++中從兩個陣列中計數和等於K的數對
給定兩個陣列Arr1[]和Arr2[]以及一個數字K。目標是找到兩個陣列元素的唯一數對,使得它們的和為K。數對的形式為(Arr1[i], Arr2[j]),其中Arr1[i]+Arr2[j]==K。
我們將使用兩個迴圈遍歷i和j。如果和(Arr1[i]+Arr2[j])==K,並且該數對不存在於unordered_map<int,int>中。將其新增到map中並遞增計數。
讓我們透過例子來理解。
輸入
Arr1[]={ 1,3,2,4,3,2 }; Arr2[]={ 0,2,1,2,3 }; K=4
輸出
Number of pairs with sum K : 4
說明
Pairs will be ( Arr1[0], Arr2[4] ) → (1,3) ( Arr1[1], Arr2[2] ) → (3,1) ( Arr1[2], Arr2[1] ) → (2,2) ( Arr1[3], Arr2[2] ) → (3,1) All other pairs already exist.Total unique pairs 4.
輸入
Arr1[]={ 0,2,1,2,3}; Arr2[]={ 1,1,1,1,1 }; K=3
輸出
Number of pairs with sum K : 1
說明
Pairs will be ( Arr1[1], Arr2[0] ) → (2,1) All other pairs already exist.Total unique pairs 1.
下面程式中使用的演算法如下
我們取兩個陣列Arr1[]和Arr2[]以及一個用於求和的變數K。
Len1和Len2用於表示兩個陣列的長度。
函式pairsumisK(int arr1[],int arr2[],int k,int l1,int l2)獲取所有變數並返回兩個陣列中和為k的唯一元素對的計數。
將初始變數count設定為0,表示數對的數量。
使用unordered_map umap儲存唯一數對。
使用兩個for迴圈遍歷兩個陣列。
對於arr1[]中的元素,從i=0到i<len1。對於arr2[]中的元素,從j=0到j<len2。
檢查arr1[i]+arr2[j]=k是否成立。如果成立,則檢查該數對是否透過umap.find(....)==umap.end()存在。
如果不存在,則將該數對新增到umap中並遞增計數。
在所有迴圈結束後,count將包含此類數對的總數。
返回計數作為結果。
示例
#include <bits/stdc++.h> using namespace std; int pairsumisK(int arr1[],int arr2[],int k,int l1,int l2){ int count = 0; unordered_map<int, int> umap; for (int i = 0; i < l1; i++){ for (int j = 0; j < l2; j++){ int sum=arr1[i]+arr2[j]; if(sum==k) //pairs with sum=k only{ if(umap.find(arr1[i]) == umap.end()) //unique pairs only{ umap.insert(make_pair(arr1[i],arr2[j])); } } } } return count; } int main(){ int Arr1[]={ 1,2,3,0,2,4 }; int Arr2[]={ 3,2,5,2 }; int len1=sizeof(Arr1)/sizeof(Arr1[0]); int len2=sizeof(Arr2)/sizeof(Arr2[0]); int K=5; //length of array cout <<endl<< "Number of pairs with sum K : "<<pairsumisK(Arr1,Arr2,K,len1,len2); return 0; }
輸出
如果我們執行上述程式碼,它將生成以下輸出:
Number of pairs with sum K : 0
廣告