使用 C++ 查找数组中的正负值对\

c++server side programmingprogramming

在本文中,我们有一个包含不同元素的数组。我们需要打印数组中绝对值相同的正负值对,并按排序顺序打印它们,例如 −

输入:arr[] = { 1, -1, 11, 12, 56, 77, -56, -12, -88}
输出:-1 1 -12 12 -56 56

输入:arr[] = {30, 40, 50, 77, -51, -50, -40}
输出:-40 40 -50 50

寻找解决方案的方法

我们想到的第一个方法是蛮力法,我们提出了另一种方法,称为高效法。我们将讨论这两种方法。

强力方法

在这种方法中,我们将用一个索引遍历数组,并找到相同的绝对值但不同的索引。

示例

#include<bits/stdc++.h>
using namespace std;

int main() {
   int arr[] = { 1, -1, 11, 12, 56, 77, -56, -12, -88 };
   int n = sizeof(arr)/sizeof(int); // 数组的大小。
   vector<int> nums; // 当前对。

   for(int i = 0; i < n; i++) {
      for(int j = i+1; j < n; j++) {
         if(abs(arr[j]) == abs(arr[i])) { // 查找对。
            nums.push_back(abs(arr[i]));
            break;
            // 如果我们找到了配对,那么我们可以中断,因为数组中有不同的元素。
         }
      }
   }
   sort(nums.begin(), nums.end());
   for(auto x : nums) // 打印配对。
      cout << -x << &" &" < < x << &" &";;
}

输出

-1 1 -12 12 -56 56

在这种方法中,我们使用两个循环来遍历数组并查找另一个元素;如果我们找到另一个元素,我们将跳出内循环以更快地运行代码。现在我们使用两个 for 循环,我们的总体时间复杂度为 O(N*N)。N 是给定数组的大小,它适用于较低的约束,但不适用于较高的约束,所以现在我们将讨论另一种方法。

高效方法

在这种方法中,我们将使用哈希图,这将有助于大幅降低我们的时间复杂度。

示例

#include<bits/stdc++.h>
using namespace std;
int main() {
   int arr[] = { 4, 8, 9, -4, 1, -1, -8, -9 };
   int n = sizeof(arr)/sizeof(int); // 数组的大小。
   map<int, int> found; // 存储找到的数字的数量。
   vector<int> nums; // 当前对。
   for(int i = 0; i < n; i++)
      found[abs(arr[i])]++; // 增加 abs(arr[i]) 的频率。
   for(auto x : found) { // 遍历映射。
      if(x.second == 2) // 如果任何数字的频率为 2,则将其推送到 nums。
         nums.push_back(x.first);
   }
   for(auto x : nums) // 打印对。
      cout << -x << &"; &"; << x << &"; &";;
}

输出

-1 1 -4 4 -8 8 -9 9

上述代码的解释

在这种方法中,我们使用哈希表来存储数字的频率;当我们遍历数组时,我们正在更新当前元素绝对值的频率,因为您知道所有对的值都是 2,因此我们正在遍历映射。

如果任何数字的频率为 2,那么我们将它存储在 nums 中,最后,我们按排序顺序打印值。(由于映射包含按排序顺序排列的数字,因此我们不需要对数字向量进行排序)。

结论

在本文中,我们解决了使用哈希技术在数组中查找正负值对的问题。我们还学习了这个问题的 C++ 程序以及我们解决这个问题的完整方法(正常和高效)。我们可以用其他语言(如 C、java、python 和其他语言)编写相同的程序。我们希望您觉得这篇文章有用。


相关文章