在数组中寻找和为指定值的两个数
来源:互联网 发布:三菱变频器软件 编辑:程序博客网 时间:2024/05/16 12:59
题目:在数组中寻找和为指定值的两个数,如arr={1, 2,3,4,7,8} ,指定值sum为12,返回4+8=12
方法1:
采用暴力破解(即穷举),时间复杂度为O(n*n),即对每一个数arr[i],搜索sum-arr[i]在不在数组中。
方法2:
根据方法1,如果数组已经排好序,可以使用二分查找sum-arr[i];如果没有排好序可以使用某种排序算法对其先进行排序(如平均复杂度为nlogn的快排(取决于划分元的选择,可以选取第一个,或者第一个和中间元素和最后一个的中位数,或者随机选取,或者按照BFPRT算法那样选取等),nlogn的堆排序或者归并排序等)。时间复杂度为nlogn。
方法3:
可以采用Hash表存储,对于每一个元素arr[i],在Hash表中查找sum-arr[j]是否存在,因为Hash查找的时间复杂度为O(1),所以期望的时间复杂度为O(n),但是因为Hash表空间有限,所以会产生冲突,解决冲突的方法有链表法和开放地址法等,比如链表法在极端情况下,所有元素都存在一个链中,那么就退化为O(n*n),这取决于Hash函数与Hash表的空间大小。这是典型的用空间换取时间。
方法4:
如果只是数组中最多存在一对这样的数,便可以采取下面的方法:
比如arr={1,2,3,4,7,8},sum=12
首先求得sum-arr={11,10,9,8,5,4}
然后定义两个索引标号i与j,i从arr头开始向后移动,j从sum-arr尾开始向前移动,哪个指向的元素小,就先移动到大于等于另一个指向的元素,如果两个指向的元素相等,则选出该元素,继续移动,直到到达边界。选中的两个元素便是结果,如果选出的元素个数小于2则该数组中没有符合条件的。但是该方法有个缺陷,如果含有多对符合条件的元素对,那么最后要从选出的结果中继续寻找。
方法5:
如果数组是无序的,则可以先进行排序(nlogn)。然后定义两个索引标号i与j,分别指向排序后的数组的头和尾,然后i向后移动(++i),j向前移动(++j),到i>=j则停止。
如果arr[i]+arr[j]=sum,则找到了一对,然后++i和++j,继续寻找;
如果arr[i]+arr[j]>sum,则--j;
如果arr[i]+arr[j]<sum,则++i;
到i>=j则停止。
时间复杂度为O(n)。
- 在数组中寻找和为指定值的两个数
- Two sum 在数组中寻找和为指定值的两个数
- 无序数组寻找两个数为指定和X
- 在一个数组中找两个数,使得它们的和为一个指定的数
- 数组------寻找和为定值的两个数
- 【扩展】快速寻找满足条件(两个数的和为指定值)的两个数
- 寻找数组中满足和为定值的两个数或所有可能组合
- Two sum(在数组中找两个数,使其和为指定值)
- 输入一个递增排序的数组和一个数字s,在数组中寻找两个数,使得这两个数的和为s
- 常见面试算法题:给定数组中寻找加和为特定数的两个数
- 面试100题:14.求在有序数组中查找两个数的和为指定数
- 面试100题:14.求在有序数组中查找两个数的和为指定数
- 找出数组中两个数之和为指定的数
- 寻找数组中两个数的和为M的组合
- 第十四题(升序数组中寻找和为特定数的两个元素)
- 第1题 在排序数组中查找和为某个指定数的两个元素之和
- 数组--数组两个数的差值为指定的值
- 编程艺术之数组例题 2.2 寻找和为定值的两个数
- 百度云推送问题
- ios7 url中带有中文后报错bad url的解决方法
- 积性函数详解
- VOIP 通信 NAT穿越系列专题
- UNIX的进程终止状态小结
- 在数组中寻找和为指定值的两个数
- jQuery浏览器类型判断
- poj 3461
- weblogic忘记用户名或者密码的解决方法
- DAY25-银行业务调度系统 小结
- Centos配置国内yum源
- 求指定分段函数y=x-1(x>1);y=-x+1(x<=1)的输出
- asp.net web.config的学习笔记
- ubuntu 环境变量PATH的修改