博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
1.在数组中找到与给定总和的配对
阅读量:5037 次
发布时间:2019-06-12

本文共 5187 字,大约阅读时间需要 17 分钟。

 

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

例如,

输入:

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

输出:

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

 

方法一:原始的方法

  c语言:

1 #include 
2 #include
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",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 
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             else26                 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 
2 using namespace std; 3 4 // 使用散列map 5 void findPair(int arr[], int n, int sum) 6 { 7 unordered_map
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
map = new HashMap
();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

你可能感兴趣的文章
DCloud-MUI:杂项
查看>>
[Noi2016]国王饮水记
查看>>
Elasticsearch和mysql数据同步(elasticsearch-jdbc)
查看>>
pyqt5的安装
查看>>
Codeforces Round #439 (Div. 2)
查看>>
Centos下PHP7.1打开Oracle扩展
查看>>
变量、初始化块和构造方法的初始化顺序问题(笔试题)
查看>>
前端 ---- js 模拟百度导航栏滚动案例
查看>>
jQuery上传文件按钮美化
查看>>
Vue安装Element 的详细步骤
查看>>
用dwr封装表单项提交表单
查看>>
Redis 哈希(Hash)
查看>>
树的统计 树链剖分
查看>>
android,微信,人人,<android 无标题栏 >微博开机加载一幅图片,再跳转到主应用的实现...
查看>>
css选择器
查看>>
python里面的xlrd模块详解以及样例
查看>>
python系统学习:第三周之文件操作
查看>>
深入理解IEnumerable和IQueryable两接口的区别
查看>>
Code First is a bad name,这些年我们对Code First的理解都错了 !很震惊吧?
查看>>
iOS 字符串的UTF8 编码 以及归档反归档
查看>>