📜  C ++程序查找具有给定差异的对

📅  最后修改于: 2022-05-13 01:55:31.709000             🧑  作者: Mango

C ++程序查找具有给定差异的对

给定一个未排序的数组和一个数 n,找出数组中是否存在一对差为 n 的元素。
例子:

Input: arr[] = {5, 20, 3, 2, 50, 80}, n = 78
Output: Pair Found: (2, 80)

Input: arr[] = {90, 70, 20, 80, 50}, n = 45
Output: No Such Pair

最简单的方法是运行两个循环,外循环选择第一个元素(较小的元素),内循环查找外循环选择的元素加上 n。该方法的时间复杂度为 O(n^2)。
我们可以使用排序和二分搜索将时间复杂度提高到 O(nLogn)。第一步是按升序对数组进行排序。数组排序后,从左到右遍历数组,对于每个元素 arr[i],在 arr[i+1..n-1] 中对 arr[i] + n 进行二分查找。如果找到该元素,则返回该对。
第一步和第二步都需要 O(nLogn)。所以总体复杂度是 O(nLogn)。
上述算法的第二步可以改进为O(n)。第一步保持不变。第二步的思路是取两个索引变量 i 和 j,分别初始化为 0 和 1。现在运行一个线性循环。如果 arr[j] – arr[i] 小于 n,我们需要寻找更大的 arr[j],所以增加 j。如果 arr[j] – arr[i] 大于 n,我们需要寻找更大的 arr[i],所以增加 i。感谢 Aashish Barnwal 提出这种方法。
以下代码仅用于算法的第二步,它假设数组已经排序。

C++
// C++ program to find a pair with the given difference 
#include 
using namespace std;
  
// The function assumes that the array is sorted 
bool findPair(int arr[], int size, int n) 
{ 
    // Initialize positions of two elements 
    int i = 0; 
    int j = 1; 
  
    // Search for a pair 
    while (i < size && j < size) 
    { 
        if (i != j && arr[j] - arr[i] == n) 
        { 
            cout << "Pair Found: (" << arr[i] <<
                        ", " << arr[j] << ")"; 
            return true; 
        } 
        else if (arr[j]-arr[i] < n) 
            j++; 
        else
            i++; 
    } 
  
    cout << "No such pair"; 
    return false; 
} 
  
// Driver program to test above function 
int main() 
{ 
    int arr[] = {1, 8, 30, 40, 100}; 
    int size = sizeof(arr)/sizeof(arr[0]); 
    int n = 60; 
    findPair(arr, size, n); 
    return 0; 
} 
  
// This is code is contributed by rathbhupendra


输出:

Pair Found: (40, 100)

散列也可以用来解决这个问题。创建一个空的哈希表 HT。遍历数组,将数组元素作为哈希键,输入HT。再次遍历数组,在 HT 中查找值 n + arr[i]。

有关详细信息,请参阅有关查找具有给定差异的一对的完整文章!