C++中從兩個已排序陣列中計數和等於給定值x的數對


給定兩個包含正數的陣列和一個值x。目標是找到陣列元素對,使得(A, B)型別的數對滿足A+B=x,其中A屬於第一個陣列,B屬於第二個陣列。

讓我們透過例子來理解

輸入 − arr_1[] = {1,2,5,3,4}; arr_2[] = {7,0,1,3}; x=6

輸出 − 從兩個已排序陣列中和等於給定值x的數對的數量為 − 2

解釋 − 數對為 (5,1) - (arr_1[2],arr_2[2]) 和 (3,3) - (arr_1[3],arr_2[3])

輸入 − arr_1[] = {1,1,1}; arr_2[] = {2,2}; x=6

輸出 − 從兩個已排序陣列中和等於給定值x的數對的數量為 − 2

解釋 − 數對為 (1,2) - (arr_1[0],arr_2[0]) 和 (1,2) - (arr_1[1],arr_2[1])

下面程式中使用的方法如下

我們將使用兩種方法。首先是使用for迴圈的樸素方法。使用for迴圈遍歷兩者,使得索引i用於arr_1[],索引j用於arr_2[]。對於數對(arr_1[i]+arr_2[j]==x),遞增計數。返回計數作為結果。

  • 取一個整數陣列arr_1[]和arr_2[],其中包含正元素,長度分別為size_arr_1和size_arr_2。

  • 函式Pair_value_x(int arr_1[], int arr_2[], int size_arr_1, int size_arr_2, int x)接收兩個陣列及其長度,並返回和為x的數對。

  • 將計數的初始值設為0。

  • 從i=0到i<size_arr_1開始遍歷arr_1[],從j=0到j開始遍歷arr_2[]。

  • 對於每個數對arr_1[i], arr_2[j],檢查其和是否為x。如果是,則遞增計數。

  • 返回計數作為結果。

高效方法

在這種方法中,我們將建立一個arr_1元素的無序集合unordered_set。現在使用for迴圈遍歷arr_2,對於每個值arr_2[i],如果x-arr_2[i]在集合中找到,則遞增計數。最後返回計數。

  • 取相同的陣列及其大小。

  • 函式Pair_value_x(int arr_1[], int arr_2[], int size_arr_1, int size_arr_2, int x)接收兩個陣列及其長度,並返回和為x的數對。

  • 將初始計數設為0。

  • 建立unordered_set<int> hash_map用於儲存arr_1的唯一元素。

  • 使用for迴圈將arr_1的元素填充到hash_map中。

  • 現在使用for迴圈遍歷arr_2[]。

  • 對於每個arr_2[j],如果使用(hash_map.find(x - arr_2[j]) != hash_map.end())在hash_map中找到x-arr_2[j],則遞增計數。

  • 最後,計數為和等於x的數對。

  • 返回計數作為結果。

示例(樸素方法)

 線上演示

#include <bits/stdc++.h>
using namespace std;
int Pair_value_x(int arr_1[], int arr_2[], int size_arr_1, int size_arr_2, int x){
   int count = 0;
   for (int i = 0; i < size_arr_1; i++){
      for (int j = 0; j < size_arr_2; j++){
         if ((arr_1[i] + arr_2[j]) == x){
            count++;
         }
      }
   }
   return count;
}
int main(){
   int arr_1[] = {1, 2, 3, 4};
   int arr_2[] = {2, 3, 4, 5};
   int size_arr_1 = sizeof(arr_1) / sizeof(arr_1[0]);
   int size_arr_2 = sizeof(arr_2) / sizeof(arr_2[0]);
   int x = 6;
   cout<<"Count of pairs from two sorted arrays whose sum is equal to a given value x are: "<<
Pair_value_x(arr_1, arr_2, size_arr_1 , size_arr_2, x);
   return 0;
}

輸出

如果執行上述程式碼,它將生成以下輸出:

Count of pairs from two sorted arrays whose sum is equal to a given value x are: 4

示例(高效方法)

 線上演示

#include <bits/stdc++.h>
using namespace std;
int Pair_value_x(int arr_1[], int arr_2[], int size_arr_1, int size_arr_2, int x){
   int count = 0;
   unordered_set<int> hash_map;
   for (int i = 0; i < size_arr_1; i++){
      hash_map.insert(arr_1[i]);
   }
   for (int j = 0; j < size_arr_2; j++){
      if (hash_map.find(x - arr_2[j]) != hash_map.end()){
         count++;
      }
   }
   return count;
}
int main(){
   int arr_1[] = {1, 2, 3, 4};
   int arr_2[] = {2, 3, 4, 5};
   int size_arr_1 = sizeof(arr_1) / sizeof(arr_1[0]);
   int size_arr_2 = sizeof(arr_2) / sizeof(arr_2[0]);
   int x = 6;
   cout<<"Count of pairs from two sorted arrays whose sum is equal to a given value x are: "<< Pair_value_x(arr_1, arr_2, size_arr_1 , size_arr_2, x);
   return 0;
}

輸出

如果執行上述程式碼,它將生成以下輸出:

Count of pairs from two sorted arrays whose sum is equal to a given value x are: 4

更新於:2020年12月2日

402 次瀏覽

開啟您的職業生涯

透過完成課程獲得認證

開始學習
廣告
© . All rights reserved.