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 次浏览

开启您的职业生涯

通过完成课程获得认证

开始学习
广告