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

更新於:2020年10月31日

242 次瀏覽

開啟您的職業生涯

完成課程獲得認證

開始學習
廣告