给定两个未排序的数组,找到其和为x的所有对

给定两个不同元素的未排序数组,任务是从两个数组中查找其和等于的所有对 十、 . 例如:

null
Input :  arr1[] = {-1, -2, 4, -6, 5, 7}         arr2[] = {6, 3, 4, 0}           x = 8Output : 4 4         5 3Input : arr1[] = {1, 2, 4, 5, 7}         arr2[] = {5, 6, 3, 4, 8}          x = 9Output : 1 8         4 5         5 4

请进来 : 亚马逊

A. 天真的方法 就是简单地运行两个循环并从两个数组中选取元素。逐个检查两个元素之和是否等于给定值x。

C++

// C++ program to find all pairs in both arrays
// whose sum is equal to given value x
#include <bits/stdc++.h>
using namespace std;
// Function to print all pairs in both arrays
// whose sum is equal to given value x
void findPairs( int arr1[], int arr2[], int n,
int m, int x)
{
for ( int i = 0; i < n; i++)
for ( int j = 0; j < m; j++)
if (arr1[i] + arr2[j] == x)
cout << arr1[i] << " "
<< arr2[j] << endl;
}
// Driver code
int main()
{
int arr1[] = { 1, 2, 3, 7, 5, 4 };
int arr2[] = { 0, 7, 4, 3, 2, 1 };
int n = sizeof (arr1) / sizeof ( int );
int m = sizeof (arr2) / sizeof ( int );
int x = 8;
findPairs(arr1, arr2, n, m, x);
return 0;
}


JAVA

// Java program to find all pairs in both arrays
// whose sum is equal to given value x
import java.io.*;
class GFG {
// Function to print all pairs in both arrays
// whose sum is equal to given value x
static void findPairs( int arr1[], int arr2[], int n,
int m, int x)
{
for ( int i = 0 ; i < n; i++)
for ( int j = 0 ; j < m; j++)
if (arr1[i] + arr2[j] == x)
System.out.println(arr1[i] + " "
+ arr2[j]);
}
// Driver code
public static void main(String[] args)
{
int arr1[] = { 1 , 2 , 3 , 7 , 5 , 4 };
int arr2[] = { 0 , 7 , 4 , 3 , 2 , 1 };
int x = 8 ;
findPairs(arr1, arr2, arr1.length, arr2.length, x);
}
}
// This code is contributed
// by sunnysingh


Python3

# Python 3 program to find all
# pairs in both arrays whose
# sum is equal to given value x
# Function to print all pairs
# in both arrays whose sum is
# equal to given value x
def findPairs(arr1, arr2, n, m, x):
for i in range ( 0 , n):
for j in range ( 0 , m):
if (arr1[i] + arr2[j] = = x):
print (arr1[i], arr2[j])
# Driver code
arr1 = [ 1 , 2 , 3 , 7 , 5 , 4 ]
arr2 = [ 0 , 7 , 4 , 3 , 2 , 1 ]
n = len (arr1)
m = len (arr2)
x = 8
findPairs(arr1, arr2, n, m, x)
# This code is contributed by Smitha Dinesh Semwal


C#

// C# program to find all
// pairs in both arrays
// whose sum is equal to
// given value x
using System;
class GFG {
// Function to print all
// pairs in both arrays
// whose sum is equal to
// given value x
static void findPairs( int [] arr1, int [] arr2,
int n, int m, int x)
{
for ( int i = 0; i < n; i++)
for ( int j = 0; j < m; j++)
if (arr1[i] + arr2[j] == x)
Console.WriteLine(arr1[i] + " " + arr2[j]);
}
// Driver code
static void Main()
{
int [] arr1 = { 1, 2, 3, 7, 5, 4 };
int [] arr2 = { 0, 7, 4, 3, 2, 1 };
int x = 8;
findPairs(arr1, arr2,
arr1.Length,
arr2.Length, x);
}
}
// This code is contributed
// by Sam007


PHP

<?php
// PHP program to find all pairs
// in both arrays whose sum is
// equal to given value x
// Function to print all pairs
// in both arrays whose sum is
// equal to given value x
function findPairs( $arr1 , $arr2 ,
$n , $m , $x )
{
for ( $i = 0; $i < $n ; $i ++)
for ( $j = 0; $j < $m ; $j ++)
if ( $arr1 [ $i ] + $arr2 [ $j ] == $x )
echo $arr1 [ $i ] . " " .
$arr2 [ $j ] . "" ;
}
// Driver code
$arr1 = array (1, 2, 3, 7, 5, 4);
$arr2 = array (0, 7, 4, 3, 2, 1);
$n = count ( $arr1 );
$m = count ( $arr2 );
$x = 8;
findPairs( $arr1 , $arr2 ,
$n , $m , $x );
// This code is contributed
// by Sam007
?>


Javascript

<script>
// Javascript program to find all pairs in both arrays
// whose sum is equal to given value x
// Function to print all pairs in both arrays
// whose sum is equal to given value x
function findPairs(arr1, arr2, n, m, x)
{
for (let i = 0; i < n; i++)
for (let j = 0; j < m; j++)
if (arr1[i] + arr2[j] == x)
document.write(arr1[i] + " "
+ arr2[j] + "<br>" );
}
// Driver code
let arr1 = [ 1, 2, 3, 7, 5, 4 ];
let arr2 = [ 0, 7, 4, 3, 2, 1 ];
let n = arr1.length;
let m = arr2.length;
let x = 8;
findPairs(arr1, arr2, n, m, x);
// This code is contributed by Surbhi Tyagi.
</script>


输出:

1 77 15 34 4

时间复杂性: O(n^2) 辅助空间: O(1)

搜索方法 :正如我们所知,排序算法可以在O(n logn)时间内对数据进行排序。因此,我们将选择O(n logn)时间算法,如:快速排序或堆排序。对于第二个数组的每个元素,我们将从K中减去它,并在第一个数组中搜索它。

步骤:

  1. 首先使用O(n logn)算法对给定数组进行排序,比如堆排序或快速排序。
  2. 为array-B(0到n)的每个元素运行一个循环。
  3. 在循环内部,使用临时变量temp,temp=K–B[i]。
  4. 使用二进制搜索(log n)在第一个数组即A中搜索temp变量。

如果元素是在A中找到的,则存在A∈ A和b∈ 使得a+B=K。

代码:

C++

#include<bits/stdc++.h>
using namespace std;
void heapify( int a[] , int n , int i)
{
int rootLargest = i;
int lchild = 2 * i;
int rchild = (2 * i) + 1;
if (lchild < n && a[lchild] > a[rootLargest])
rootLargest = lchild;
if (rchild < n && a[rchild] > a[rootLargest])
rootLargest = rchild;
if (rootLargest != i)
{
swap(a[i] , a[rootLargest]);
//Recursion
heapify(a , n , rootLargest);
}
}
int binarySearch( int a[] , int l , int r , int x)
{
while (l <= r)
{
int m = l + (r - l) / 2;
if (a[m] == x)
return m;
if (a[m] < x)
l = m + 1;
else
r = m - 1;
}
return -1;
}
int main()
{
int A[] = {1,2,1,3,4};
int B[] = {3,1,5,1,2};
int K = 8;
int n = sizeof (A) / sizeof (A[0]);
// Building the heap
for ( int i = n / 2 - 1 ; i >= 1; i--)
heapify(A , n , i);
for ( int i=0 ; i<n ; i++) //O(n)
{
int temp = K - B[i]; //O(1)
if (binarySearch(A , 0 , n-1 , temp)) //O(logn)
{
cout<< "Found the elements." ;
break ;
}
}
return 0;
}


JAVA

import java.util.*;
class GFG{
static int A[] = { 1 , 2 , 1 , 3 , 4 };
static void heapify( int n , int i)
{
int rootLargest = i;
int lchild = 2 * i;
int rchild = ( 2 * i) + 1 ;
if (lchild < n && A[lchild] > A[rootLargest])
rootLargest = lchild;
if (rchild < n && A[rchild] > A[rootLargest])
rootLargest = rchild;
if (rootLargest != i)
{
int t = A[i];
A[i] = A[rootLargest];
A[rootLargest] = t;
//Recursion
heapify( n , rootLargest);
}
}
static int binarySearch( int l , int r , int x)
{
while (l <= r)
{
int m = l + (r - l) / 2 ;
if (A[m] == x)
return m;
if (A[m] < x)
l = m + 1 ;
else
r = m - 1 ;
}
return - 1 ;
}
public static void main(String[] args)
{
int B[] = { 3 , 1 , 5 , 1 , 2 };
int K = 8 ;
int n = A.length;
// Building the heap
for ( int i = n / 2 - 1 ; i >= 1 ; i--)
heapify( n , i);
for ( int i = 0 ; i < n; i++) //O(n)
{
int temp = K - B[i]; //O(1)
if (binarySearch( 0 , n - 1 , temp - 1 ) != - 1 ) //O(logn)
{
System.out.print( "Found the elements." );
break ;
}
}
}
}
// This code is contributed by Rajput-Ji


Python3

A = [ 1 , 2 , 1 , 3 , 4 ];
def heapify(n, i):
rootLargest = i;
lchild = 2 * i;
rchild = ( 2 * i) + 1 ;
if (lchild < n and A[lchild] > A[rootLargest]):
rootLargest = lchild;
if (rchild < n and A[rchild] > A[rootLargest]):
rootLargest = rchild;
if (rootLargest ! = i):
t = A[i];
A[i] = A[rootLargest];
A[rootLargest] = t;
# Recursion
heapify(n, rootLargest);
def binarySearch(l, r, x):
while (l < = r):
m = l + (r - l) / / 2 ;
if (A[m] = = x):
return m;
if (A[m] < x):
l = m + 1 ;
else :
r = m - 1 ;
return - 1 ;
if __name__ = = '__main__' :
B = [ 3 , 1 , 5 , 1 , 2 ];
K = 8 ;
n = len (A);
# Building the heap
for i in range (n / / 2 - 1 , 0 , - 1 ):
heapify(n, i);
for i in range (n):
temp = K - B[i];
if (binarySearch( 0 , n - 1 , temp - 1 ) ! = - 1 ):
print ( "Found the elements." );
break ;
# This code is contributed by Rajput-Ji


C#

using System;
public class GFG {
static int []A = { 1, 2, 1, 3, 4 };
static void heapify( int n, int i) {
int rootLargest = i;
int lchild = 2 * i;
int rchild = (2 * i) + 1;
if (lchild < n && A[lchild] > A[rootLargest])
rootLargest = lchild;
if (rchild < n && A[rchild] > A[rootLargest])
rootLargest = rchild;
if (rootLargest != i) {
int t = A[i];
A[i] = A[rootLargest];
A[rootLargest] = t;
// Recursion
heapify(n, rootLargest);
}
}
static int binarySearch( int l, int r, int x) {
while (l <= r) {
int m = l + (r - l) / 2;
if (A[m] == x)
return m;
if (A[m] < x)
l = m + 1;
else
r = m - 1;
}
return -1;
}
public static void Main(String[] args) {
int []B = { 3, 1, 5, 1, 2 };
int K = 8;
int n = A.Length;
// Building the heap
for ( int i = n / 2 - 1; i >= 1; i--)
heapify(n, i);
for ( int i = 0; i < n; i++) // O(n)
{
int temp = K - B[i]; // O(1)
if (binarySearch(0, n - 1, temp - 1) != -1) // O(logn)
{
Console.Write( "Found the elements." );
break ;
}
}
}
}
// This code is contributed by Rajput-Ji


Javascript

<script>
function heapify(a,n,i)
{
let rootLargest = i;
let lchild = 2 * i;
let rchild = (2 * i) + 1;
if (lchild < n && a[lchild] > a[rootLargest])
rootLargest = lchild;
if (rchild < n && a[rchild] > a[rootLargest])
rootLargest = rchild;
if (rootLargest != i)
{
swap(a[i] , a[rootLargest]);
//Recursion
heapify(a , n , rootLargest);
}
}
function binarySearch(a,l,r,x)
{
while (l <= r)
{
let m = l + (r - l) / 2;
if (a[m] == x)
return m;
if (a[m] < x)
l = m + 1;
else
r = m - 1;
}
return -1;
}
let A = [1,2,1,3,4];
let B = [3,1,5,1,2];
let K = 8;
let n = A.length;
// Building the heap
for (let i = n / 2 - 1 ; i >= 1; i--)
heapify(A , n , i);
for (let i=0 ; i<n ; i++) //O(n)
{
let temp = K - B[i]; //O(1)
if (binarySearch(A , 0 , n-1 , temp)) //O(logn)
{
document.write( "Found the elements." );
break ;
}
}
</script>


输出:

Found the elements

时间复杂度:O(n logn)。

O(对数n+n对数n)

所以,总体时间复杂度=O(n logn)。

有效解决方案 这个问题的关键在于 散列 .哈希表是使用 C++中的无序序集 .

  • 我们将所有第一个数组元素存储在哈希表中。
  • 对于第二个数组的元素,我们从x中减去每个元素,并在哈希表中检查结果。
  • 如果结果存在,我们打印元素并输入哈希(第一个数组的元素)。

C++

// C++ program to find all pair in both arrays
// whose sum is equal to given value x
#include <bits/stdc++.h>
using namespace std;
// Function to find all pairs in both arrays
// whose sum is equal to given value x
void findPairs( int arr1[], int arr2[], int n,
int m, int x)
{
// Insert all elements of first array in a hash
unordered_set< int > s;
for ( int i = 0; i < n; i++)
s.insert(arr1[i]);
// Subtract sum from second array elements one
// by one and check it's present in array first
// or not
for ( int j = 0; j < m; j++)
if (s.find(x - arr2[j]) != s.end())
cout << x - arr2[j] << " "
<< arr2[j] << endl;
}
// Driver code
int main()
{
int arr1[] = { 1, 0, -4, 7, 6, 4 };
int arr2[] = { 0, 2, 4, -3, 2, 1 };
int x = 8;
int n = sizeof (arr1) / sizeof ( int );
int m = sizeof (arr2) / sizeof ( int );
findPairs(arr1, arr2, n, m, x);
return 0;
}


JAVA

// JAVA Code for Given two unsorted arrays,
// find all pairs whose sum is x
import java.util.*;
class GFG {
// Function to find all pairs in both arrays
// whose sum is equal to given value x
public static void findPairs( int arr1[], int arr2[],
int n, int m, int x)
{
// Insert all elements of first array in a hash
HashMap<Integer, Integer> s = new HashMap<Integer, Integer>();
for ( int i = 0 ; i < n; i++)
s.put(arr1[i], 0 );
// Subtract sum from second array elements one
// by one and check it's present in array first
// or not
for ( int j = 0 ; j < m; j++)
if (s.containsKey(x - arr2[j]))
System.out.println(x - arr2[j] + " " + arr2[j]);
}
/* Driver program to test above function */
public static void main(String[] args)
{
int arr1[] = { 1 , 0 , - 4 , 7 , 6 , 4 };
int arr2[] = { 0 , 2 , 4 , - 3 , 2 , 1 };
int x = 8 ;
findPairs(arr1, arr2, arr1.length, arr2.length, x);
}
}
// This code is contributed by Arnav Kr. Mandal.


Python3

# Python3 program to find all
# pair in both arrays whose
# sum is equal to given value x
# Function to find all pairs
# in both arrays whose sum is
# equal to given value x
def findPairs(arr1, arr2, n, m, x):
# Insert all elements of
# first array in a hash
s = set ()
for i in range ( 0 , n):
s.add(arr1[i])
# Subtract sum from second
# array elements one by one
# and check it's present in
# array first or not
for j in range ( 0 , m):
if ((x - arr2[j]) in s):
print ((x - arr2[j]), '', arr2[j])
# Driver code
arr1 = [ 1 , 0 , - 4 , 7 , 6 , 4 ]
arr2 = [ 0 , 2 , 4 , - 3 , 2 , 1 ]
x = 8
n = len (arr1)
m = len (arr2)
findPairs(arr1, arr2, n, m, x)
# This code is contributed
# by ihritik


C#

// C# Code for Given two unsorted arrays,
// find all pairs whose sum is x
using System;
using System.Collections.Generic;
class GFG {
// Function to find all pairs in
// both arrays whose sum is equal
// to given value x
public static void findPairs( int [] arr1, int [] arr2,
int n, int m, int x)
{
// Insert all elements of first
// array in a hash
Dictionary< int ,
int >
s = new Dictionary< int ,
int >();
for ( int i = 0; i < n; i++) {
s[arr1[i]] = 0;
}
// Subtract sum from second array
// elements one by one and check
// it's present in array first
// or not
for ( int j = 0; j < m; j++) {
if (s.ContainsKey(x - arr2[j])) {
Console.WriteLine(x - arr2[j] + " " + arr2[j]);
}
}
}
// Driver Code
public static void Main( string [] args)
{
int [] arr1 = new int [] { 1, 0, -4, 7, 6, 4 };
int [] arr2 = new int [] { 0, 2, 4, -3, 2, 1 };
int x = 8;
findPairs(arr1, arr2, arr1.Length,
arr2.Length, x);
}
}
// This code is contributed by Shrikant13


Javascript

<script>
//  Javascript Code for Given two unsorted arrays,
// find all pairs whose sum is x
// Function to find all pairs in both arrays
// whose sum is equal to given value x
function findPairs(arr1, arr2, n, m, x)
{
// Insert all elements of first array in a hash
let s = new Map();
for (let i = 0; i < n; i++)
s.set(arr1[i], 0);
// Subtract sum from second array elements one
// by one and check it's present in array first
// or not
for (let j = 0; j < m; j++)
if (s.has(x - arr2[j]))
document.write(x - arr2[j] + " " + arr2[j] + "<br/>" );
}
// Driver code
let arr1 = [ 1, 0, -4, 7, 6, 4 ];
let arr2 = [ 0, 2, 4, -3, 2, 1 ];
let x = 8;
findPairs(arr1, arr2, arr1.length, arr2.length, x);
</script>


输出:

6 24 46 27 1

时间复杂性: O(最大值(n,m)) 辅助空间: O(n)

本文由 丹麦拉扎 .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 写极客。组织 或者把你的文章寄去评论-team@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。 如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。

© 版权声明
THE END
喜欢就支持一下吧
点赞7 分享