• 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)

  • 相关阅读:
    第16次作业
    第15次作业
    第14次作业
    第13次作业
    第12次作业
    第11次作业
    第十次作业
    第九次作业
    第八次作业
    滚动视图练习
  • 原文地址:https://www.cnblogs.com/swifthua/p/7643154.html
Copyright © 2020-2023  润新知