1.在数组中找到与给定总和的配对

 

给定一个未排序的整数数组,找到一对给定的和

例如,

输入:
arr=[8,7,2,5,3,1]
sum=10

输出:
对发现在索引0和2(8+2)
or
对发现在索引1和4(7+3)

 

方法一:原始的方法

  c语言:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 //使用给定的和找到一个数组中的一对的原始方法
 5 void findPair(int arr[], int n, int sum)
 6 {
 7     for (int i = 0; i < n - 1; i++)
 8     {
 9         for (int j = i + 1; j < n; j++)
10         {
11             // 找到这样的对,打印并返回
12             if (arr[i] + arr[j] == sum)
13             {
14                 printf("Pair found at index %d and %d", i, j);
15                 return;
16             }
17         }
18     }
19 
20     //在数组中不存在给定和的对
21     printf("Pair not found");
22 }
23 
24 int main()
25 {
26     int arr[] = { 8, 7, 2, 5, 3, 1 };
27     int sum = 10;
28 
29     int n = sizeof(arr) / sizeof(arr[0]);
30     //printf("%d
",n);
31 
32     findPair(arr, n, sum);
33 
34     system("pause");
35     return 0;
36 }

  java:

 1 package 排列;
 2 
 3 public class FindPair{
 4     public static void findPair(int arr[], int sum){
 5         int n = arr.length;
 6 
 7         for (int i = 0; i < n - 1; i++){
 8             
 9             for (int j = i + 1; j < n; j++){
10                 
11                 if (arr[i] + arr[j] == sum){
12                     System.out.println("Pair found at index " + i + " and " + j);
13                     return;
14                 }
15             }
16         }
17         
18         System.out.println("Pair not found");
19     }
20 
21 
22     public static void main (String[] args)
23     {
24         int arr[] = { 8, 7, 2, 5, 3, 1 };
25         int sum = 10;
26           
27         findPair(arr, sum);
28     }
29 }

输出:

  在索引0和2找到的对

 

上述解的时间复杂度为O(n^2),程序使用的辅助空间为O(1)

 

方法2:使用O(nlogn)排序法
  这个想法是按照升序对给定的数组进行排序,并通过维持最初指向数组的两个端点的两个索引(低和高)来维护搜索空间。

  c语言:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 //使用排序在给定的数组中找到一个数组的函数
 5 void findPair(int arr[], int n, int sum)
 6 {
 7     //升序排序
 8     sort(arr, arr + n);
 9 
10     //维护指向数组终点的两个索引
11     int low = 0;
12     int high = n - 1;
13 
14     //在循环的每次迭代中减少搜索空间arr [low..high]
15     //循环直到低小于高
16     while (low < high)
17     {
18         if (arr[low] + arr[high] == sum)
19         {
20             cout << "Pair found ";
21             return;
22         }
23 
24         //如果total小于期望的总和,则递增低索引
25         //递减高指数是总和多于总和
26         (arr[low] + arr[high] < sum) ? low++ : high--;
27     }
28 
29     cout << "Pair not found";
30 }
31 
32 int main()
33 {
34     int arr[] = { 8, 7, 2, 5, 3, 1 };
35     int sum = 10;
36 
37     int n = sizeof(arr) / sizeof(arr[0]);
38 
39     findPair(arr, n, sum);
40 
41     system("pause");
42     return 0;
43 }

  java语言:

 1 package 排列;
 2 
 3 import java.util.Arrays;
 4 
 5 public class FindPair2
 6 {
 7     public static void findPair(int arr[], int sum)
 8     {
 9         Arrays.sort(arr);
10 
11         int low = 0;
12         int high = arr.length - 1;
13      
15         while (low < high)
16         {
17             if (arr[low] + arr[high] == sum)
18             {
19                 System.out.println("Pair found");
20                 return;
21             }
22      
23             if (arr[low] + arr[high] < sum)
24                 low++;
25             else
26                 high--;
27         }
28      
29         System.out.println("Pair not found");
30     }
31 
32     public static void main (String[] args)
33     {
34         int arr[] = { 8, 7, 2, 5, 3, 1 };
35         int sum = 10;
36           
37         findPair(arr, sum);
38     }
39 }

 

输出:

  找到对

 

上述解的时间复杂度为O(nlogn),程序使用的辅助空间为O(1)

 

方法3:为O(n)使用散列
  这个想法是将数组arr[i]的每一个元素插入map中。我们还可以检查map中是否存在差异(arr[i],sum-arr[i])

  c语言:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 // 使用散列map
 5 void findPair(int arr[], int n, int sum)
 6 {
 7     unordered_map<int, int> map;
 8 
 9     for (int i = 0; i < n; i++)
10     {
11         //检查对(arr [i],sum-arr [i])是否存在
12 
13         //如果差异见于之前,打印对
14         if (map.find(sum - arr[i]) != map.end())
15         {
16             cout << "Pair found at index " << map[sum - arr[i]] << " and " << i;
17             return;
18         }
19 
20         //在map中存储当前元素的索引
21         map[arr[i]] = i;
22     }
23 
24     cout << "Pair not found";
25 }
26 
27 int main()
28 {
29     int arr[] = { 8, 7, 2, 5, 3, 1 };
30     int sum = 10;
31 
32     int n = sizeof(arr) / sizeof(arr[0]);
33 
34     findPair(arr, n, sum);
35 
36     system("pause");
37     return 0;
38 }

 

  java语言:

 1 package 排列;
 2 
 3 import java.util.HashMap;
 4 import java.util.Map;
 5 
 6 public class FindPair3
 7 {
 8     public static void findPair(int arr[], int sum)
 9     {
10         Map<Integer, Integer> map = new HashMap<Integer, Integer>();
11      
12         for (int i = 0; i < arr.length; i++)
13         {
14      
15             if (map.containsKey(sum - arr[i]))
16             {
17                 System.out.println("Pair found at index " + 
18                         map.get(sum - arr[i]) + " and " + i);
19                 return;
20             }
21      
22             map.put(arr[i], i);
23         }
24 
25         System.out.println("Pair not found");
26     }
27 
28     public static void main (String[] args)
29     {
30         int arr[] = { 8, 7, 2, 5, 3, 1 };
31         int sum = 10;
32           
33         findPair(arr, sum);
34     }
35 }

输出:

  在索引0和2找到的对

 

上述解的时间复杂度为O(n),程序使用的辅助空间为O(n)

原文地址:https://www.cnblogs.com/swifthua/p/7643154.html