使用 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 和其他语言)编写相同的程序。我们希望您觉得这篇文章有用。