Как найти пару чисел в одномерном массиве

Given an array arr[] of N integers, the task is to find all the pairs possible from the given array. 
Note: 
 

  1. (arr[i], arr[i]) is also considered as a valid pair.
  2. (arr[i], arr[j]) and (arr[j], arr[i]) are considered as two different pairs.

Examples: 
 

Input: arr[] = {1, 2} 
Output: (1, 1), (1, 2), (2, 1), (2, 2).
Input: arr[] = {1, 2, 3} 
Output: (1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3) 
 

Approach: 
In order to find all the possible pairs from the array, we need to traverse the array and select the first element of the pair. Then we need to pair this element with all the elements in the array from index 0 to N-1. 
Below is the step by step approach: 
 

  • Traverse the array and select an element in each traversal.
  • For each element selected, traverse the array with help of another loop and form the pair of this element with each element in the array from the second loop.
  • The array in the second loop will get executed from its first element to its last element, i.e. from index 0 to N-1.
  • Print each pair formed.

Below is the implementation of the above approach:
 

C++

#include <bits/stdc++.h>

using namespace std;

void printPairs(int arr[], int n)

{

    for (int i = 0; i < n; i++) {

        for (int j = 0; j < n; j++) {

            cout << "(" << arr[i] << ", "

                 << arr[j] << ")"

                 << ", ";

        }

    }

}

int main()

{

    int arr[] = { 1, 2 };

    int n = sizeof(arr) / sizeof(arr[0]);

    printPairs(arr, n);

    return 0;

}

Java

class GFG{

static void printPairs(int arr[], int n)

{

    for (int i = 0; i < n; i++) {

        for (int j = 0; j < n; j++) {

            System.out.print("(" +  arr[i]+ ", "

                 + arr[j]+ ")"

                + ", ");

        }

    }

}

public static void main(String[] args)

{

    int arr[] = { 1, 2 };

    int n = arr.length;

    printPairs(arr, n);

}

}

Python3

def printPairs(arr, n):

    for i in range(n):

        for j in range(n):

            print("(",arr[i],",",arr[j],")",end=", ")

arr=[1, 2]

n = len(arr)

printPairs(arr, n)

C#

using System;

class GFG{

static void printPairs(int []arr, int n)

{

    for (int i = 0; i < n; i++) {

        for (int j = 0; j < n; j++) {

            Console.Write("(" +  arr[i]+ ", "

                 + arr[j]+ ")"

                + ", ");

        }

    }

}

public static void Main(string[] args)

{

    int []arr = { 1, 2 };

    int n = arr.Length;

    printPairs(arr, n);

}

}

Javascript

<script>

function printPairs(arr, n)

{

    for (var i = 0; i < n; i++) {

        for (var j = 0; j < n; j++) {

            document.write("(" + arr[i] + ", "

                 + arr[j] + ")"

                 + ", ");

        }

    }

}

var arr = [ 1, 2 ];

var n = arr.length;

printPairs(arr, n);

</script>

Output

(1, 1), (1, 2), (2, 1), (2, 2), 

Time Complexity: O(N2)

Auxiliary Space: O(1)
 

Using Merge Sort 

Approach : 

During the merge operation in merge sort we can get all the pairs and we can store those pairs into a vector of pairs. 

By just making few changes into the merge sort algorithm we can get all the pairs.

C++

#include<bits/stdc++.h>

using namespace std;

void getPairsMerge(int arr[],int l,int r,int mid,vector<pair<int,int>>&p){

    int b[l+r+1],i=l,k=l,j=mid+1;

    while(i<=mid && j<=r){

        if(arr[i]>arr[j]){

            b[k]=arr[j];

            p.push_back({arr[i],arr[j]});

            p.push_back({arr[j],arr[i]});

            p.push_back({arr[j],arr[j]});

            k++;

            j++;

        }

        else{

            p.push_back({arr[i],arr[j]});

            p.push_back({arr[j],arr[i]});

            p.push_back({arr[i],arr[i]});

            b[k]=arr[i];

            i++;

            k++;

        }

    }

    while(i<=mid){

        b[k]=arr[i];

        p.push_back({arr[i],arr[i]});

        i++;

        k++;

    }

    while(j<=r){

        b[k]=arr[j];

        p.push_back({arr[j],arr[j]});

        j++;

        k++;

    }

    for(int x=l;x<=r;x++){

        arr[x]=b[x];

    }

}

void getAllPairs(int arr[],int l,int r,vector<pair<int,int>>&p){

    if(l<r){

        int mid=(l+r)/2;

        getAllPairs(arr,l,mid,p);

        getAllPairs(arr,mid+1,r,p);

        getPairsMerge(arr,l,r,mid,p);

    }

}

int main(){

    int n=2;

    int arr[n]={1,2};

    vector<pair<int,int>>p;

    getAllPairs(arr,0,n-1,p);

    for(auto it:p){

        cout<<it.first<<" "<<it.second<<endl;

    }

}

Java

import java.util.*;

class GFG {

  static void

    getPairsMerge(int[] arr, int l, int r, int mid,

                  ArrayList<ArrayList<Integer> > p)

  {

    int[] b = new int[l + r + 1];

    int i = l, k = l, j = mid + 1;

    while (i <= mid && j <= r) {

      if (arr[i] > arr[j]) {

        b[k] = arr[j];

        ArrayList<Integer> a1

          = new ArrayList<Integer>();

        a1.add(arr[i]);

        a1.add(arr[j]);

        ArrayList<Integer> a2

          = new ArrayList<Integer>();

        a2.add(arr[j]);

        a2.add(arr[i]);

        ArrayList<Integer> a3

          = new ArrayList<Integer>();

        a3.add(arr[j]);

        a3.add(arr[j]);

        p.add(a1);

        p.add(a2);

        p.add(a3);

        k++;

        j++;

      }

      else {

        ArrayList<Integer> a1

          = new ArrayList<Integer>();

        a1.add(arr[i]);

        a1.add(arr[j]);

        ArrayList<Integer> a2

          = new ArrayList<Integer>();

        a2.add(arr[j]);

        a2.add(arr[i]);

        ArrayList<Integer> a3

          = new ArrayList<Integer>();

        a3.add(arr[i]);

        a3.add(arr[i]);

        p.add(a1);

        p.add(a2);

        p.add(a3);

        b[k] = arr[i];

        i++;

        k++;

      }

    }

    while (i <= mid) {

      b[k] = arr[i];

      ArrayList<Integer> a3

        = new ArrayList<Integer>();

      a3.add(arr[i]);

      a3.add(arr[i]);

      p.add(a3);

      i++;

      k++;

    }

    while (j <= r) {

      b[k] = arr[j];

      ArrayList<Integer> a3

        = new ArrayList<Integer>();

      a3.add(arr[j]);

      a3.add(arr[j]);

      p.add(a3);

      j++;

      k++;

    }

    for (int x = l; x <= r; x++) {

      arr[x] = b[x];

    }

  }

  static void

    getAllPairs(int[] arr, int l, int r,

                ArrayList<ArrayList<Integer> > p)

  {

    if (l < r) {

      int mid = (l + r) / 2;

      getAllPairs(arr, l, mid, p);

      getAllPairs(arr, mid + 1, r, p);

      getPairsMerge(arr, l, r, mid, p);

    }

  }

  public static void main(String[] args)

  {

    int n = 2;

    int[] arr = { 1, 2 };

    ArrayList<ArrayList<Integer> > p

      = new ArrayList<ArrayList<Integer> >();

    getAllPairs(arr, 0, n - 1, p);

    for (ArrayList<Integer> it : p)

      System.out.println(it.get(0) + " " + it.get(1));

  }

}

Python3

def getPairsMerge(arr, l, r, mid, p):

    b = [0 for _ in range(l + r + 1)]

    i=l

    k=l

    j=mid+1;

    while(i<=mid and j<=r):

        if(arr[i]>arr[j]):

            b[k]=arr[j];

            p.append([arr[i],arr[j]]);

            p.append([arr[j],arr[i]]);

            p.append([arr[j],arr[j]]);

            k+= 1;

            j+= 1;

        else:

            p.append([arr[i],arr[j]]);

            p.append([arr[j],arr[i]]);

            p.append([arr[i],arr[i]]);

            b[k]=arr[i];

            i+= 1;

            k+= 1;

    while(i<=mid):

        b[k]=arr[i];

        p.append([arr[i],arr[i]]);

        i+= 1;

        k+= 1;

    while(j<=r):

        b[k]=arr[j];

        p.append([arr[j],arr[j]]);

        j+= 1;

        k+= 1;

    for x in range(l, r + 1):

        arr[x]=b[x];

def getAllPairs(arr, l, r, p):

    if(l<r):

        mid=int((l+r)/2);

        getAllPairs(arr,l,mid,p);

        getAllPairs(arr,mid+1,r,p);

        getPairsMerge(arr,l,r,mid,p);

n=2;

arr = [0 for _ in range(n)]

arr[0] = 1;

arr[1] = 2;

p = [];

getAllPairs(arr,0,n-1,p);

for it in p:

    print(it[0], it[1])

C#

using System;

using System.Collections.Generic;

class GFG {

  static void getPairsMerge(int[] arr, int l, int r,

                            int mid, List<int[]> p)

  {

    int[] b = new int[l + r + 1];

    int i = l, k = l, j = mid + 1;

    while (i <= mid && j <= r) {

      if (arr[i] > arr[j]) {

        b[k] = arr[j];

        p.Add(new[] { arr[i], arr[j] });

        p.Add(new[] { arr[j], arr[i] });

        p.Add(new[] { arr[j], arr[j] });

        k++;

        j++;

      }

      else {

        p.Add(new[] { arr[i], arr[j] });

        p.Add(new[] { arr[j], arr[i] });

        p.Add(new[] { arr[i], arr[i] });

        b[k] = arr[i];

        i++;

        k++;

      }

    }

    while (i <= mid) {

      b[k] = arr[i];

      p.Add(new[] { arr[i], arr[i] });

      i++;

      k++;

    }

    while (j <= r) {

      b[k] = arr[j];

      p.Add(new[] { arr[j], arr[j] });

      j++;

      k++;

    }

    for (int x = l; x <= r; x++) {

      arr[x] = b[x];

    }

  }

  static void getAllPairs(int[] arr, int l, int r,

                          List<int[]> p)

  {

    if (l < r) {

      int mid = (l + r) / 2;

      getAllPairs(arr, l, mid, p);

      getAllPairs(arr, mid + 1, r, p);

      getPairsMerge(arr, l, r, mid, p);

    }

  }

  public static void Main(string[] args)

  {

    int n = 2;

    int[] arr = { 1, 2 };

    List<int[]> p = new List<int[]>();

    getAllPairs(arr, 0, n - 1, p);

    foreach(var it in p)

      Console.WriteLine(it[0] + " " + it[1]);

  }

}

Javascript

function getPairsMerge(arr, l, r, mid, p)

{

    let b = new Array(l+r+1).fill(0);

    let i=l,k=l,j=mid+1;

    while(i<=mid && j<=r){

        if(arr[i]>arr[j]){

            b[k]=arr[j];

            p.push([arr[i],arr[j]]);

            p.push([arr[j],arr[i]]);

            p.push([arr[j],arr[j]]);

            k++;

            j++;

        }

        else{

            p.push([arr[i],arr[j]]);

            p.push([arr[j],arr[i]]);

            p.push([arr[i],arr[i]]);

            b[k]=arr[i];

            i++;

            k++;

        }

    }

    while(i<=mid){

        b[k]=arr[i];

        p.push([arr[i],arr[i]]);

        i++;

        k++;

    }

    while(j<=r){

        b[k]=arr[j];

        p.push([arr[j],arr[j]]);

        j++;

        k++;

    }

    for(let x=l;x<=r;x++){

        arr[x]=b[x];

    }

}

function getAllPairs(arr, l, r, p)

{

    if(l<r){

        let mid= Math.floor((l+r)/2);

        getAllPairs(arr,l,mid,p);

        getAllPairs(arr,mid+1,r,p);

        getPairsMerge(arr,l,r,mid,p);

    }

}

let n=2;

let arr = new Array(n).fill(0);

arr[0] = 1;

arr[1] = 2;

let p = [];

getAllPairs(arr,0,n-1,p);

for(var it of p)

    console.log(it[0], it[1])

Time Complexity : O (N LogN )

Auxiliary Space: O(l + r)

Last Updated :
13 Sep, 2022

Like Article

Save Article

Дан несортированный массив целых чисел, найти в нем пару с заданной суммой.

Например,

Input:

 
nums = [8, 7, 2, 5, 3, 1]
target = 10

 
Output:

 
Pair found (8, 2)
or
Pair found (7, 3)

 
 
Input:

 
nums = [5, 2, 6, 8, 1, 9]
target = 12

 
Output: Pair not found

Потренируйтесь в этой проблеме

Существует несколько методов решения этой проблемы с использованием грубой силы, сортировки и хеширования. Они обсуждаются ниже:

1. Использование грубой силы

Наивное решение состоит в том, чтобы рассматривать каждую пару в заданном массиве и возвращаться, если искомая сумма найдена. Этот подход демонстрируется ниже на C, Java и Python:

C

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

#include <stdio.h>

// Наивный метод поиска пары в массиве с заданной суммой

void findPair(int nums[], int n, int target)

{

    // рассмотрим каждый элемент, кроме последнего

    for (int i = 0; i < n 1; i++)

    {

        // начинаем с i-го элемента до последнего элемента

        for (int j = i + 1; j < n; j++)

        {

            // если искомая сумма найдена, выводим ее

            if (nums[i] + nums[j] == target)

            {

                printf(«Pair found (%d, %d)n», nums[i], nums[j]);

                return;

            }

        }

    }

    // доходим сюда, если пара не найдена

    printf(«Pair not found»);

}

int main(void)

{

    int nums[] = { 8, 7, 2, 5, 3, 1 };

    int target = 10;

    int n = sizeof(nums)/sizeof(nums[0]);

    findPair(nums, n, target);

    return 0;

}

Скачать  Выполнить код

результат:

Pair found (8, 2)

Java

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

class Main

{

    // Наивный метод поиска пары в массиве с заданной суммой

    public static void findPair(int[] nums, int target)

    {

        // рассмотрим каждый элемент, кроме последнего

        for (int i = 0; i < nums.length 1; i++)

        {

            // начинаем с i-го элемента до последнего элемента

            for (int j = i + 1; j < nums.length; j++)

            {

                // если искомая сумма найдена, выводим ее

                if (nums[i] + nums[j] == target)

                {

                    System.out.printf(«Pair found (%d, %d)», nums[i], nums[j]);

                    return;

                }

            }

        }

        // доходим сюда, если пара не найдена

        System.out.println(«Pair not found»);

    }

    public static void main (String[] args)

    {

        int[] nums = { 8, 7, 2, 5, 3, 1 };

        int target = 10;

        findPair(nums, target);

    }

}

Скачать  Выполнить код

результат:

Pair found (8, 2)

Python

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

# Наивный метод поиска пары в списке с заданной суммой

def findPair(nums, target):

    # учитывает каждый элемент, кроме последнего

    for i in range(len(nums) 1):

        # начинается с i-го элемента до последнего элемента

        for j in range(i + 1, len(nums)):

            # если искомая сумма найдена, вывести ее

            if nums[i] + nums[j] == target:

                print(‘Pair found’, (nums[i], nums[j]))

                return

    # В списке нет пары с указанной суммой

    print(‘Pair not found’)

if __name__ == ‘__main__’:

    nums = [8, 7, 2, 5, 3, 1]

    target = 10

    findPair(nums, target)

Скачать  Выполнить код

результат:

Pair found (8, 2)

Временная сложность приведенного выше решения равна O(n2) и не требует дополнительного места, где n это размер ввода.

2. Использование сортировки

Идея состоит в том, чтобы отсортировать заданный массив в порядке возрастания и поддерживать пространство поиска, сохраняя два индекса (low а также high), который изначально указывает на две конечные точки массива. Затем уменьшите область поиска nums[low…high] на каждой итерации цикла путем сравнения суммы элементов, присутствующих в индексах low а также high с желаемой суммой. Увеличение low если сумма меньше ожидаемой суммы; в противном случае уменьшить high если сумма больше желаемой суммы. Если пара найдена, вернуть ее.

Ниже приведена реализация C++, Java и Python, основанная на идее:

C++

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

#include <iostream>

#include <algorithm>

using namespace std;

// Функция поиска пары в массиве с заданной суммой с помощью сортировки

void findPair(int nums[], int n, int target)

{

    // сортируем массив по возрастанию

    sort(nums, nums + n);

    // поддерживать два индекса, указывающих на конечные точки массива

    int low = 0;

    int high = n 1;

    // уменьшаем пространство поиска `nums[low…high]` на каждой итерации цикла

    // цикл до тех пор, пока пространство поиска не будет исчерпано

    while (low < high)

    {

        // сумма найдена

        if (nums[low] + nums[high] == target)

        {

            cout << «Pair found (« << nums[low] << «, « << nums[high] << «)n»;

            return;

        }

        // увеличиваем `low` индекс, если сумма меньше желаемой суммы;

        // уменьшаем индекс `high`, если сумма больше желаемой суммы

        (nums[low] + nums[high] < target)? low++: high;

    }

    // доходим сюда, если пара не найдена

    cout << «Pair not found»;

}

int main()

{

    int nums[] = { 8, 7, 2, 5, 3, 1 };

    int target = 10;

    int n = sizeof(nums)/sizeof(nums[0]);

    findPair(nums, n, target);

    return 0;

}

Скачать  Выполнить код

результат:

Pair found (2, 8)

Java

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

import java.util.Arrays;

class Main

{

    // Функция поиска пары в массиве с заданной суммой с помощью сортировки

    public static void findPair(int[] nums, int target)

    {

        // сортируем массив по возрастанию

        Arrays.sort(nums);

        // поддерживать два индекса, указывающих на конечные точки массива

        int low = 0;

        int high = nums.length 1;

        // уменьшаем пространство поиска `nums[low…high]` на каждой итерации цикла

        // цикл до тех пор, пока пространство поиска не будет исчерпано

        while (low < high)

        {

            // сумма найдена

            if (nums[low] + nums[high] == target)

            {

                System.out.printf(«Pair found (%d, %d)», nums[low], nums[high]);

                return;

            }

            // увеличиваем `low` индекс, если сумма меньше желаемой суммы;

            // уменьшаем индекс `high`, если сумма больше желаемой суммы

            if (nums[low] + nums[high] < target) {

                low++;

            }

            else {

                high;

            }

        }

        // доходим сюда, если пара не найдена

        System.out.println(«Pair not found»);

    }

    public static void main (String[] args)

    {

        int[] nums = { 8, 7, 2, 5, 3, 1 };

        int target = 10;

        findPair(nums, target);

    }

}

Скачать  Выполнить код

результат:

Pair found (2, 8)

Python

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

# Функция поиска пары в массиве с заданной суммой с помощью сортировки

def findPair(nums, target):

    # сортирует список по возрастанию

    nums.sort()

    # поддерживает два индекса, указывающих на конечные точки списка

    (low, high) = (0, len(nums) 1)

    # уменьшает пространство поиска `nums[low…high]` на каждой итерации цикла

    # Цикл # до тех пор, пока пространство поиска не будет исчерпано

    while low < high:

        if nums[low] + nums[high] == target:        # Цель # найдена

            print(‘Pair found’, (nums[low], nums[high]))

            return

        # увеличивает `low` индекс, если общая сумма меньше желаемой суммы;

        # уменьшает `high` индекс, если сумма больше желаемой суммы

        if nums[low] + nums[high] < target:

            low = low + 1

        else:

            high = high 1

    # Пара с указанной суммой не существует

    print(‘Pair not found’)

if __name__ == ‘__main__’:

    nums = [8, 7, 2, 5, 3, 1]

    target = 10

    findPair(nums, target)

Скачать  Выполнить код

результат:

Pair found (2, 8)

Временная сложность приведенного выше решения равна O(n.log(n)) и не требует дополнительного места.

3. Использование хеширования

Мы можем использовать хеш-таблица решить эту задачу за линейное время. Идея состоит в том, чтобы вставить каждый элемент массива nums[i] в карту. Мы также проверяем, есть ли разница (nums[i], target - nums[i]) уже есть на карте или нет. Если разница видна раньше, напечатайте пару и вернитесь. Алгоритм может быть реализован следующим образом на C++, Java и Python:

C++

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

#include <iostream>

#include <unordered_map>

using namespace std;

// Функция поиска пары в массиве с заданной суммой с использованием хеширования

void findPair(int nums[], int n, int target)

{

    // создаем пустую карту

    unordered_map<int, int> map;

    // делаем для каждого элемента

    for (int i = 0; i < n; i++)

    {

        // проверяем, существует ли пара (nums[i], target — nums[i])

        // если разница была видна раньше, выводим пару

        if (map.find(target nums[i]) != map.end())

        {

            cout << «Pair found (« << nums[map[target nums[i]]] << «, «

                 << nums[i] << «)n»;

            return;

        }

        // сохраняем индекс текущего элемента на карте

        map[nums[i]] = i;

    }

    // доходим сюда, если пара не найдена

    cout << «Pair not found»;

}

int main()

{

    int nums[] = { 8, 7, 2, 5, 3, 1 };

    int target = 10;

    int n = sizeof(nums)/sizeof(nums[0]);

    findPair(nums, n, target);

    return 0;

}

Скачать  Выполнить код

результат:

Pair found (8, 2)

Java

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

import java.util.HashMap;

import java.util.Map;

class Main

{

    // Функция поиска пары в массиве с заданной суммой с использованием хеширования

    public static void findPair(int[] nums, int target)

    {

        // создаем пустой HashMap

        Map<Integer, Integer> map = new HashMap<>();

        // делаем для каждого элемента

        for (int i = 0; i < nums.length; i++)

        {

            // проверяем, существует ли пара (nums[i], target-nums[i])

            // если разница была видна раньше, выводим пару

            if (map.containsKey(target nums[i]))

            {

                System.out.printf(«Pair found (%d, %d)»,

                    nums[map.get(target nums[i])], nums[i]);

                return;

            }

            // сохраняем индекс текущего элемента на карте

            map.put(nums[i], i);

        }

        // доходим сюда, если пара не найдена

        System.out.println(«Pair not found»);

    }

    public static void main (String[] args)

    {

        int[] nums = { 8, 7, 2, 5, 3, 1 };

        int target = 10;

        findPair(nums, target);

    }

}

Скачать  Выполнить код

результат:

Pair found (8, 2)

Python

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

# Функция поиска пары в массиве с заданной суммой с использованием хеширования

def findPair(nums, target):

    # создать пустой словарь

    d = {}

    # делаем на каждый элемент

    for i, e in enumerate(nums):

        # проверяет, существует ли пара (e, target — e)

        #, если разница была видна раньше, вывести пару

        if target e in d:

            print(‘Pair found’, (nums[d.get(target e)], nums[i]))

            return

        # сохраняет индекс текущего элемента в словаре

        d[e] = i

    # В списке нет пары с указанной суммой

    print(‘Pair not found’)

if __name__ == ‘__main__’:

    nums = [8, 7, 2, 5, 3, 1]

    target = 10

    findPair(nums, target)

Скачать  Выполнить код

результат:

Pair found (8, 2)

Временная сложность приведенного выше решения равна O(n) и требует O(n) дополнительное пространство, где n это размер ввода.

 
Упражнение: Расширьте решение, чтобы вывести все пары в массиве, имеющие заданную сумму.

 
Похожие сообщения:

Найти тройку с заданной суммой в массиве

4–Суммированная задача | Четверки с заданной суммой

Найдите пару с заданной суммой в BST

Если имеется, к примеру массив вида { 10, 10, 10, 10, 20, 20 }, то count после цикла будет равно 4, и вы получите, что имеется только 2 пары равных элементов, используя формулу count /= 2.. На самом деле правильно было бы считать 10, 10, 10, 10 == 3 Затем ( 3 + 1 ) / 2 == 2. То же самое и здесь 20, 20 == 1, ( 1 + 1 ) / 2 = 1.

При вашем подсчете, вы теряете остаток от деления на 2 для каждого числа одинаковых чисел.

Могу предложить следующее решение

#include <iostream>
#include <vector>
#include <algorithm>

int main() 
{
    std::vector<int> v = { 10, 20, 20, 10, 10, 30, 50, 10, 20 };

    std::sort( v.begin(), v.end() );

    std::vector<int>::size_type count = 0;

    for ( std::vector<int>::size_type i = 0; ++i < v.size(); )
    {
        if ( v[i] == v[i-1] )
        {
            ++i; ++count;
        }
    }

    std::cout << "count = " << count << std::endl;

    return 0;
}

Для заданного массива вывод на консоль программы будет таким

count = 3

Эту задачу можно решить двумя способами. Выбор определяется компромиссом между эффективностью использования времени, памяти или сложностью кода.

Простое решение

Очень простое и эффективное (по времени) решение — создание хэш-таблицы, отображающей целое число в целое число. Данный алгоритм работает, пошагово проходя весь массив. Для каждого элемента x в хэш-таблице ищется sum – x и, если запись существует, выводится (x, sum — x). После этого x добавляется в таблицу и проверяется следующий элемент.

Альтернативное решение

Давайте начнем с формулировки. Если мы попытаемся найти пару чисел, сумма которых равна z, то дополнение будет z – x (величина, которую нужно добавить к x, что бы получить z). Если мы попытаемся найти пару чисел, при суммировании которых получается 12, дополнением к -5 будет число 17.

Представьте, что у нас есть отсортированный массив {-2, -1, 0, 3, 5, 6, 7, 9, 13, 14}. Пусть first указывает на начало массива, а last — на его конец. Чтобы найти дополнение к first, мы двигаем last назад, пока не найдем искомую величину. Если first + last < sum, то дополнения к first  не существует. Можно также перемещать first  на встречу к last. Тогда мы остановимся, если first окажется больше, чем last.

Почему такое решение найдет все дополнения к first? Поскольку массив отсортирован, мы проверяем меньшие числа. Когда first + last меньше sum, нет смысла проверять меньшие значения, они не помогут найти дополнение.

Почему данное решение найдет все дополнения last? Потому что все пары формируются с помощью first и last. Мы нашли все дополнения first,  а значит, нашли все дополнения last.

void printPairSums (int[] array, int sum) {
	Arrays.sort(array);
	int first = 0;
	int last = array.length - 1;
	while (first < last) {
		int s = array[first] + array[last];
		if (s == sum) {
			System.out.printIn(array[first] + "" + array[last]);
			first++;
			last--;
		} else {
			if (s < sum) first++;
			else last--;
		}
	}
}

Разбор по книге «Карьера программиста. Как устроиться на работу в Google, Microsoft или другую ведущую IT – Компанию»

Студворк — интернет-сервис помощи студентам

Из всех пар элементов, равноудаленных от начала и конца одномерного массива A(M), найдите пару элементов, имеющих наибольшую сумму. Если элемент не имеет пары, то он не рассматривается. Выход. данные: [индекс элемента массива A из пары] [пробел] [индекс другого элемента массива A из пары]

Как доделать или переделать код?

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
// Из всех пар элементов, равноудаленных от начала и конца одномерного массива A(M), 
//найдите пару элементов, имеющих наибольшую сумму.
 
#include "stdafx.h"
#include <math.h>
#include <conio.h>
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{   
    int A [20] = {}; // Массив, в котором нужно найти пару с максимальной суммой
    int M; // Количество элементов в массиве
    int Sum; // Сумма 2х элементов массива
    int maxSum = 0; // Максимальная сумма 2х элементов массива
    int i; // Элемент массива
    int N; // Cамый большой возможный индекс, правый край массива
    bool diap = true; // Проверка диапазона элементов
    
 
    
    // Ввод данных...
    // ... размер массива
    printf("array size = ");
    scanf ("%d", &M);
    if (M < 2 || M > 20) // проверка диапазона размера
        printf("invalid array size !!!");
    else
    {// ...элементы массива
        printf("array =n");
        for(i = 0; i < M; i++)
        {
            if (diap)
            {
                scanf("%d", &A[i]);
                if (A[i] < -1000 || A[i] > 1000) // проверка диапазона элементов
                {
                    printf("invalid array element !!!");
                    diap = false; 
                }
            }
        }
        
        if (diap)
        {
            N = M - 1;
            for (i = 0; i < M/2; i++)
            {// Нахождение максимальной суммы пары
                Sum = 0;
                
                Sum = A[i] + A[N-1]; //Нахождение суммы 2x элементов
                
                if (Sum > maxSum)
                {
                    maxSum = Sum;}      
            }
        
        }
    }
 
    return 0;
}

Понравилась статья? Поделить с друзьями:

Не пропустите также:

  • Как найти продуктивность работы
  • Как найти свой окпо на сайте статистики
  • Как найти среднюю скорость по уравнению скорости
  • Как составить налоговую декларацию на возврат ндфл за обучение
  • Как составить годовую бухгалтерскую отчетность за отчетный год

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии